[ https://issues.apache.org/jira/browse/FLINK-3140?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15062006#comment-15062006 ]
ASF GitHub Bot commented on FLINK-3140: --------------------------------------- Github user tillrohrmann commented on a diff in the pull request: https://github.com/apache/flink/pull/1465#discussion_r47902384 --- Diff: flink-staging/flink-table/src/main/scala/org/apache/flink/api/table/typeinfo/NullMaskUtils.scala --- @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.flink.api.table.typeinfo + +import org.apache.flink.api.table.Row +import org.apache.flink.core.memory.{DataInputView, DataOutputView} + +object NullMaskUtils { + + def writeNullMask(len: Int, value: Row, target: DataOutputView): Unit = { + var b = 0x00 + var bytePos = 0 + + var fieldPos = 0 + while (fieldPos < len) { + b = 0x00 + // set bits in byte + bytePos = 0 + while (bytePos < 8 && fieldPos < len) { + b = b << 1 + // set bit if field is null + if(value.productElement(fieldPos) == null) { + b |= 0x01 + } + bytePos += 1 + fieldPos += 1 + } + // shift bits if last byte is not completely filled + while (bytePos < 8) { + b = b << 1 + bytePos += 1 + } + // write byte + target.writeByte(b) + } --- End diff -- I think the same can be expressed a bit more sacalesque ``` value.productIterator.grouped(8).foreach{ group => val byte = group.foldLeft(0){ (byteResult, element) => (byteResult << 1) | (if (element == null) 0x01 else 0x00) } val finalResult = byte << (8 - group.length) target.writeByte(finalResult) } ``` > NULL value data layout in Row Serializer/Comparator > --------------------------------------------------- > > Key: FLINK-3140 > URL: https://issues.apache.org/jira/browse/FLINK-3140 > Project: Flink > Issue Type: Sub-task > Components: Table API > Reporter: Chengxiang Li > Assignee: Timo Walther > > To store/materialize NULL value in Row objects, we should need new Row > Serializer/Comparator which is aware of NULL value fields. -- This message was sent by Atlassian JIRA (v6.3.4#6332)