|
@@ -8,7 +8,6 @@
|
|
|
package org.elasticsearch.compute.data;
|
|
|
|
|
|
import org.apache.lucene.util.BytesRef;
|
|
|
-import org.elasticsearch.common.lucene.BytesRefs;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
@@ -16,7 +15,7 @@ import java.util.List;
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
|
import static org.elasticsearch.common.lucene.BytesRefs.toBytesRef;
|
|
|
-import static org.elasticsearch.compute.data.Block.constantNullBlock;
|
|
|
+import static org.elasticsearch.compute.data.ElementType.fromJava;
|
|
|
|
|
|
public final class BlockUtils {
|
|
|
|
|
@@ -43,6 +42,10 @@ public final class BlockUtils {
|
|
|
append.accept(o);
|
|
|
};
|
|
|
}
|
|
|
+
|
|
|
+ public void accept(Object object) {
|
|
|
+ append.accept(object);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public static Block[] fromArrayRow(Object... row) {
|
|
@@ -62,27 +65,15 @@ public final class BlockUtils {
|
|
|
Block[] blocks = new Block[size];
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
Object object = row.get(i);
|
|
|
- if (object instanceof Integer intVal) {
|
|
|
- blocks[i] = IntBlock.newConstantBlockWith(intVal, blockSize);
|
|
|
- } else if (object instanceof Long longVal) {
|
|
|
- blocks[i] = LongBlock.newConstantBlockWith(longVal, blockSize);
|
|
|
- } else if (object instanceof Double doubleVal) {
|
|
|
- blocks[i] = DoubleBlock.newConstantBlockWith(doubleVal, blockSize);
|
|
|
- } else if (object instanceof BytesRef bytesRefVal) {
|
|
|
- blocks[i] = BytesRefBlock.newConstantBlockWith(bytesRefVal, blockSize);
|
|
|
- } else if (object instanceof Boolean booleanVal) {
|
|
|
- blocks[i] = BooleanBlock.newConstantBlockWith(booleanVal, blockSize);
|
|
|
- } else if (object instanceof List<?> listVal) {
|
|
|
- BuilderWrapper wrapper = wrapperFor(listVal.get(0).getClass(), 1);
|
|
|
- wrapper.append.accept(listVal);
|
|
|
+ if (object instanceof List<?> listVal) {
|
|
|
+ BuilderWrapper wrapper = wrapperFor(fromJava(listVal.get(0).getClass()), blockSize);
|
|
|
+ wrapper.accept(listVal);
|
|
|
if (isAscending(listVal)) {
|
|
|
wrapper.builder.mvOrdering(Block.MvOrdering.ASCENDING);
|
|
|
}
|
|
|
blocks[i] = wrapper.builder.build();
|
|
|
- } else if (object == null) {
|
|
|
- blocks[i] = constantNullBlock(blockSize);
|
|
|
} else {
|
|
|
- throw new UnsupportedOperationException("can't make a block out of [" + object + "/" + object.getClass() + "]");
|
|
|
+ blocks[i] = constantBlock(object, blockSize);
|
|
|
}
|
|
|
}
|
|
|
return blocks;
|
|
@@ -121,7 +112,7 @@ public final class BlockUtils {
|
|
|
var wrappers = new BuilderWrapper[list.get(0).size()];
|
|
|
|
|
|
for (int i = 0; i < wrappers.length; i++) {
|
|
|
- wrappers[i] = wrapperFor(type(list, i), size);
|
|
|
+ wrappers[i] = wrapperFor(fromJava(type(list, i)), size);
|
|
|
}
|
|
|
for (List<Object> values : list) {
|
|
|
for (int j = 0, vSize = values.size(); j < vSize; j++) {
|
|
@@ -149,65 +140,9 @@ public final class BlockUtils {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public static BuilderWrapper wrapperFor(Class<?> type, int size) {
|
|
|
- BuilderWrapper builder;
|
|
|
- if (type == Integer.class) {
|
|
|
- var b = IntBlock.newBlockBuilder(size);
|
|
|
- builder = new BuilderWrapper(b, o -> b.appendInt((int) o));
|
|
|
- } else if (type == Long.class) {
|
|
|
- var b = LongBlock.newBlockBuilder(size);
|
|
|
- builder = new BuilderWrapper(b, o -> b.appendLong((long) o));
|
|
|
- } else if (type == Double.class) {
|
|
|
- var b = DoubleBlock.newBlockBuilder(size);
|
|
|
- builder = new BuilderWrapper(b, o -> b.appendDouble((double) o));
|
|
|
- } else if (type == BytesRef.class) {
|
|
|
- var b = BytesRefBlock.newBlockBuilder(size);
|
|
|
- builder = new BuilderWrapper(b, o -> b.appendBytesRef(BytesRefs.toBytesRef(o)));
|
|
|
- } else if (type == Boolean.class) {
|
|
|
- var b = BooleanBlock.newBlockBuilder(size);
|
|
|
- builder = new BuilderWrapper(b, o -> b.appendBoolean((boolean) o));
|
|
|
- } else if (type == null) {
|
|
|
- var b = new Block.Builder() {
|
|
|
- @Override
|
|
|
- public Block.Builder appendNull() {
|
|
|
- return this;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Block.Builder beginPositionEntry() {
|
|
|
- return this;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Block.Builder endPositionEntry() {
|
|
|
- return this;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Block.Builder copyFrom(Block block, int beginInclusive, int endExclusive) {
|
|
|
- return this;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Block.Builder mvOrdering(Block.MvOrdering mvOrdering) {
|
|
|
- throw new UnsupportedOperationException();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Block.Builder appendAllValuesToCurrentPosition(Block block) {
|
|
|
- throw new UnsupportedOperationException();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Block build() {
|
|
|
- return constantNullBlock(size);
|
|
|
- }
|
|
|
- };
|
|
|
- builder = new BuilderWrapper(b, o -> {});
|
|
|
- } else {
|
|
|
- throw new UnsupportedOperationException("Unrecognized type " + type);
|
|
|
- }
|
|
|
- return builder;
|
|
|
+ public static BuilderWrapper wrapperFor(ElementType type, int size) {
|
|
|
+ var b = type.newBlockBuilder(size);
|
|
|
+ return new BuilderWrapper(b, o -> appendValue(b, o, type));
|
|
|
}
|
|
|
|
|
|
public static void appendValue(Block.Builder builder, Object val, ElementType type) {
|
|
@@ -225,6 +160,21 @@ public final class BlockUtils {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static Block constantBlock(Object val, int size) {
|
|
|
+ if (val == null) {
|
|
|
+ return Block.constantNullBlock(size);
|
|
|
+ }
|
|
|
+ var type = fromJava(val.getClass());
|
|
|
+ return switch (type) {
|
|
|
+ case LONG -> LongBlock.newConstantBlockWith((long) val, size);
|
|
|
+ case INT -> IntBlock.newConstantBlockWith((int) val, size);
|
|
|
+ case BYTES_REF -> BytesRefBlock.newConstantBlockWith(toBytesRef(val), size);
|
|
|
+ case DOUBLE -> DoubleBlock.newConstantBlockWith((double) val, size);
|
|
|
+ case BOOLEAN -> BooleanBlock.newConstantBlockWith((boolean) val, size);
|
|
|
+ default -> throw new UnsupportedOperationException("unsupported element type [" + type + "]");
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Returned by {@link #toJavaObject} for "doc" type blocks.
|
|
|
*/
|