Skip to content

Commit e1f3892

Browse files
committed
apacheGH-725: Added ExtensionReader
1 parent 0d296df commit e1f3892

File tree

7 files changed

+166
-1
lines changed

7 files changed

+166
-1
lines changed

vector/src/main/codegen/templates/AbstractFieldReader.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,23 @@ public void copyAsField(String name, ${name}Writer writer) {
108108
}
109109

110110
</#list></#list>
111+
112+
public void read(ExtensionHolder holder) {
113+
fail("Extension");
114+
}
115+
116+
public void read(int arrayIndex, ExtensionHolder holder) {
117+
fail("RepeatedExtension");
118+
}
119+
120+
public void copyAsValue(AbstractExtensionTypeWriter writer) {
121+
fail("CopyAsValueExtension");
122+
}
123+
124+
public void copyAsField(String name, AbstractExtensionTypeWriter writer) {
125+
fail("CopyAsFieldExtension");
126+
}
127+
111128
public FieldReader reader(String name) {
112129
fail("reader(String name)");
113130
return null;

vector/src/main/codegen/templates/BaseReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public interface RepeatedMapReader extends MapReader{
7373

7474
public interface ScalarReader extends
7575
<#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first /> ${name}Reader, </#list></#list>
76-
BaseReader {}
76+
ExtensionReader, BaseReader {}
7777

7878
interface ComplexReader{
7979
StructReader rootAsStruct();

vector/src/main/codegen/templates/NullReader.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ public void read(int arrayIndex, Nullable${name}Holder holder){
8686
}
8787
</#list></#list>
8888

89+
public void read(ExtensionHolder holder) {
90+
holder.isSet = 0;
91+
}
92+
8993
public int size(){
9094
return 0;
9195
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.arrow.vector.complex.reader;
18+
19+
import org.apache.arrow.vector.holders.ExtensionHolder;
20+
21+
/** Interface for reading extension types. Extends the functionality of {@link BaseReader}. */
22+
public interface ExtensionReader extends BaseReader {
23+
24+
/**
25+
* Reads to the given extension holder.
26+
*
27+
* @param holder the {@link ExtensionHolder} to read
28+
*/
29+
void read(ExtensionHolder holder);
30+
31+
/**
32+
* Reads and returns an object representation of the extension type.
33+
*
34+
* @return the object representation of the extension type
35+
*/
36+
Object readObject();
37+
38+
/**
39+
* Checks if the current value is set.
40+
*
41+
* @return true if the value is set, false otherwise
42+
*/
43+
boolean isSet();
44+
}

vector/src/test/java/org/apache/arrow/vector/UuidVector.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import java.util.UUID;
2121
import org.apache.arrow.memory.BufferAllocator;
2222
import org.apache.arrow.memory.util.hash.ArrowBufHasher;
23+
import org.apache.arrow.vector.complex.impl.UuidReaderImpl;
24+
import org.apache.arrow.vector.complex.reader.FieldReader;
25+
import org.apache.arrow.vector.holder.UuidHolder;
2326
import org.apache.arrow.vector.types.pojo.Field;
2427
import org.apache.arrow.vector.types.pojo.FieldType;
2528
import org.apache.arrow.vector.types.pojo.UuidType;
@@ -79,11 +82,21 @@ public TransferPair makeTransferPair(ValueVector to) {
7982
return new TransferImpl((UuidVector) to);
8083
}
8184

85+
@Override
86+
protected FieldReader getReaderImpl() {
87+
return new UuidReaderImpl(this);
88+
}
89+
8290
public void setSafe(int index, byte[] value) {
8391
getUnderlyingVector().setIndexDefined(index);
8492
getUnderlyingVector().setSafe(index, value);
8593
}
8694

95+
public void get(int index, UuidHolder holder) {
96+
holder.value = getUnderlyingVector().get(index);
97+
holder.isSet = 1;
98+
}
99+
87100
public class TransferImpl implements TransferPair {
88101
UuidVector to;
89102
ValueVector targetUnderlyingVector;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.arrow.vector.complex.impl;
18+
19+
import org.apache.arrow.vector.UuidVector;
20+
import org.apache.arrow.vector.holder.UuidHolder;
21+
import org.apache.arrow.vector.holders.ExtensionHolder;
22+
import org.apache.arrow.vector.types.Types.MinorType;
23+
import org.apache.arrow.vector.types.pojo.Field;
24+
25+
public class UuidReaderImpl extends AbstractFieldReader {
26+
27+
private final UuidVector vector;
28+
29+
public UuidReaderImpl(UuidVector vector) {
30+
super();
31+
this.vector = vector;
32+
}
33+
34+
@Override
35+
public MinorType getMinorType() {
36+
return vector.getMinorType();
37+
}
38+
39+
public Field getField() {
40+
return vector.getField();
41+
}
42+
43+
public boolean isSet() {
44+
return !vector.isNull(idx());
45+
}
46+
47+
public void read(ExtensionHolder holder) {
48+
UuidHolder uuidHolder = (UuidHolder) holder;
49+
vector.get(idx(), uuidHolder);
50+
}
51+
}

vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashSet;
3232
import java.util.List;
3333
import java.util.Set;
34+
import java.util.UUID;
3435
import org.apache.arrow.memory.ArrowBuf;
3536
import org.apache.arrow.memory.BufferAllocator;
3637
import org.apache.arrow.memory.RootAllocator;
@@ -64,16 +65,19 @@
6465
import org.apache.arrow.vector.complex.impl.UnionMapReader;
6566
import org.apache.arrow.vector.complex.impl.UnionReader;
6667
import org.apache.arrow.vector.complex.impl.UnionWriter;
68+
import org.apache.arrow.vector.complex.impl.UuidWriterFactory;
6769
import org.apache.arrow.vector.complex.reader.BaseReader.StructReader;
6870
import org.apache.arrow.vector.complex.reader.BigIntReader;
6971
import org.apache.arrow.vector.complex.reader.FieldReader;
7072
import org.apache.arrow.vector.complex.reader.Float4Reader;
7173
import org.apache.arrow.vector.complex.reader.Float8Reader;
7274
import org.apache.arrow.vector.complex.reader.IntReader;
7375
import org.apache.arrow.vector.complex.writer.BaseWriter.ComplexWriter;
76+
import org.apache.arrow.vector.complex.writer.BaseWriter.ExtensionWriter;
7477
import org.apache.arrow.vector.complex.writer.BaseWriter.ListWriter;
7578
import org.apache.arrow.vector.complex.writer.BaseWriter.MapWriter;
7679
import org.apache.arrow.vector.complex.writer.BaseWriter.StructWriter;
80+
import org.apache.arrow.vector.holder.UuidHolder;
7781
import org.apache.arrow.vector.holders.DecimalHolder;
7882
import org.apache.arrow.vector.holders.DurationHolder;
7983
import org.apache.arrow.vector.holders.FixedSizeBinaryHolder;
@@ -93,6 +97,7 @@
9397
import org.apache.arrow.vector.types.pojo.ArrowType.Utf8;
9498
import org.apache.arrow.vector.types.pojo.Field;
9599
import org.apache.arrow.vector.types.pojo.FieldType;
100+
import org.apache.arrow.vector.types.pojo.UuidType;
96101
import org.apache.arrow.vector.util.CallBack;
97102
import org.apache.arrow.vector.util.DecimalUtility;
98103
import org.apache.arrow.vector.util.JsonStringArrayList;
@@ -2489,4 +2494,35 @@ public void unionWithVarCharAndBinaryHelpers() throws Exception {
24892494
"row12", new String(vector.getLargeVarBinaryVector().get(11), StandardCharsets.UTF_8));
24902495
}
24912496
}
2497+
2498+
@Test
2499+
public void extensionWriterReader() throws Exception {
2500+
// test values
2501+
UUID u1 = UUID.randomUUID();
2502+
2503+
try (NonNullableStructVector parent = NonNullableStructVector.empty("parent", allocator)) {
2504+
// write
2505+
2506+
ComplexWriter writer = new ComplexWriterImpl("root", parent);
2507+
StructWriter rootWriter = writer.rootAsStruct();
2508+
2509+
{
2510+
ExtensionWriter extensionWriter = rootWriter.extension("uuid1", new UuidType());
2511+
extensionWriter.setPosition(0);
2512+
extensionWriter.addExtensionTypeWriterFactory(new UuidWriterFactory());
2513+
extensionWriter.writeExtension(u1);
2514+
}
2515+
// read
2516+
StructReader rootReader = new SingleStructReaderImpl(parent).reader("root");
2517+
{
2518+
FieldReader uuidReader = rootReader.reader("uuid1");
2519+
uuidReader.setPosition(0);
2520+
UuidHolder uuidHolder = new UuidHolder();
2521+
uuidReader.read(uuidHolder);
2522+
final ByteBuffer bb = ByteBuffer.wrap(uuidHolder.value);
2523+
UUID actualUuid = new UUID(bb.getLong(), bb.getLong());
2524+
assertEquals(u1, actualUuid);
2525+
}
2526+
}
2527+
}
24922528
}

0 commit comments

Comments
 (0)