Skip to content

Commit cbe342a

Browse files
dfa1claude
andcommitted
feat(array): add fold to IntArray, FloatArray, ShortArray, ByteArray
Consistent with LongArray/DoubleArray. Uses appropriate functional interfaces: IntBinaryOperator for IntArray, DoubleBinaryOperator for FloatArray, LongBinaryOperator for ShortArray/ByteArray (avoids overflow). Simplify non-nullable branches in numericSum to use fold. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent ff66e7a commit cbe342a

5 files changed

Lines changed: 47 additions & 21 deletions

File tree

core/src/main/java/io/github/dfa1/vortex/core/array/ByteArray.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.lang.foreign.MemorySegment;
88
import java.lang.foreign.ValueLayout;
9+
import java.util.function.LongBinaryOperator;
910

1011
/// Concrete [Array] for I8/U8 primitive columns.
1112
public final class ByteArray implements Array {
@@ -53,4 +54,14 @@ public int getInt(long i) {
5354
boolean unsigned = dtype instanceof DType.Primitive p && p.ptype() == PType.U8;
5455
return unsigned ? Byte.toUnsignedInt(raw) : raw;
5556
}
57+
58+
public long fold(long identity, LongBinaryOperator op) {
59+
MemorySegment buf = buffer;
60+
long n = length;
61+
long result = identity;
62+
for (long i = 0; i < n; i++) {
63+
result = op.applyAsLong(result, buf.get(ValueLayout.JAVA_BYTE, i));
64+
}
65+
return result;
66+
}
5667
}

core/src/main/java/io/github/dfa1/vortex/core/array/FloatArray.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.github.dfa1.vortex.encoding.PTypeIO;
66

77
import java.lang.foreign.MemorySegment;
8+
import java.util.function.DoubleBinaryOperator;
89

910
/// Concrete [Array] for F32 primitive columns.
1011
public final class FloatArray implements Array {
@@ -46,4 +47,14 @@ public MemorySegment buffer(int i) {
4647
public float getFloat(long i) {
4748
return buffer.getAtIndex(PTypeIO.LE_FLOAT, i);
4849
}
50+
51+
public double fold(double identity, DoubleBinaryOperator op) {
52+
MemorySegment buf = buffer;
53+
long n = length;
54+
double result = identity;
55+
for (long i = 0; i < n; i++) {
56+
result = op.applyAsDouble(result, buf.getAtIndex(PTypeIO.LE_FLOAT, i));
57+
}
58+
return result;
59+
}
4960
}

core/src/main/java/io/github/dfa1/vortex/core/array/IntArray.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.github.dfa1.vortex.core.DType;
55
import io.github.dfa1.vortex.encoding.PTypeIO;
66
import java.lang.foreign.MemorySegment;
7+
import java.util.function.IntBinaryOperator;
78
import java.util.function.IntConsumer;
89

910
/// Concrete [Array] for I32/U32 primitive columns.
@@ -54,4 +55,14 @@ public void forEachInt(IntConsumer c) {
5455
c.accept(buf.getAtIndex(PTypeIO.LE_INT, i));
5556
}
5657
}
58+
59+
public int fold(int identity, IntBinaryOperator op) {
60+
MemorySegment buf = buffer;
61+
long n = length;
62+
int result = identity;
63+
for (long i = 0; i < n; i++) {
64+
result = op.applyAsInt(result, buf.getAtIndex(PTypeIO.LE_INT, i));
65+
}
66+
return result;
67+
}
5768
}

core/src/main/java/io/github/dfa1/vortex/core/array/ShortArray.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.github.dfa1.vortex.encoding.PTypeIO;
77

88
import java.lang.foreign.MemorySegment;
9+
import java.util.function.LongBinaryOperator;
910

1011
/// Concrete [Array] for I16/U16 primitive columns.
1112
public final class ShortArray implements Array {
@@ -53,4 +54,14 @@ public int getInt(long i) {
5354
boolean unsigned = dtype instanceof DType.Primitive p && p.ptype() == PType.U16;
5455
return unsigned ? Short.toUnsignedInt(raw) : raw;
5556
}
57+
58+
public long fold(long identity, LongBinaryOperator op) {
59+
MemorySegment buf = buffer;
60+
long n = length;
61+
long result = identity;
62+
for (long i = 0; i < n; i++) {
63+
result = op.applyAsLong(result, buf.getAtIndex(PTypeIO.LE_SHORT, i));
64+
}
65+
return result;
66+
}
5667
}

integration/src/test/java/io/github/dfa1/vortex/integration/VortexHttpReaderJniComparisonIntegrationTest.java

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -339,27 +339,9 @@ private static Double numericSum(Array arr) {
339339
return switch (arr) {
340340
case LongArray v -> (double) v.fold(0L, Long::sum);
341341
case DoubleArray v -> v.fold(0.0, Double::sum);
342-
case IntArray v -> {
343-
long s = 0;
344-
for (long i = 0; i < v.length(); i++) {
345-
s += v.getInt(i);
346-
}
347-
yield (double) s;
348-
}
349-
case FloatArray v -> {
350-
double s = 0;
351-
for (long i = 0; i < v.length(); i++) {
352-
s += v.getFloat(i);
353-
}
354-
yield s;
355-
}
356-
case ShortArray v -> {
357-
long s = 0;
358-
for (long i = 0; i < v.length(); i++) {
359-
s += v.getShort(i);
360-
}
361-
yield (double) s;
362-
}
342+
case IntArray v -> (double) v.fold(0, Integer::sum);
343+
case FloatArray v -> v.fold(0.0, Double::sum);
344+
case ShortArray v -> (double) v.fold(0L, Long::sum);
363345
default -> null;
364346
};
365347
}

0 commit comments

Comments
 (0)