diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java index 2cdd9b8edfce1..8b364c58fbe73 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java @@ -245,11 +245,11 @@ public void reset() { this.firstValue.reset(); } - private void addIntInput(Column valueColumn, Column timeColumn) { - // TODO can add first position optimization if first position is null ? + protected void addIntInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateIntFirstValue(valueColumn.getInt(i), timeColumn.getLong(i)); + return; } } } @@ -262,10 +262,11 @@ protected void updateIntFirstValue(int value, long curTime) { } } - private void addLongInput(Column valueColumn, Column timeColumn) { + protected void addLongInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateLongFirstValue(valueColumn.getLong(i), timeColumn.getLong(i)); + return; } } } @@ -278,10 +279,11 @@ protected void updateLongFirstValue(long value, long curTime) { } } - private void addFloatInput(Column valueColumn, Column timeColumn) { + protected void addFloatInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateFloatFirstValue(valueColumn.getFloat(i), timeColumn.getLong(i)); + return; } } } @@ -294,10 +296,11 @@ protected void updateFloatFirstValue(float value, long curTime) { } } - private void addDoubleInput(Column valueColumn, Column timeColumn) { + protected void addDoubleInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateDoubleFirstValue(valueColumn.getDouble(i), timeColumn.getLong(i)); + return; } } } @@ -310,10 +313,11 @@ protected void updateDoubleFirstValue(double value, long curTime) { } } - private void addBinaryInput(Column valueColumn, Column timeColumn) { + protected void addBinaryInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateBinaryFirstValue(valueColumn.getBinary(i), timeColumn.getLong(i)); + return; } } } @@ -326,10 +330,11 @@ protected void updateBinaryFirstValue(Binary value, long curTime) { } } - private void addBooleanInput(Column valueColumn, Column timeColumn) { + protected void addBooleanInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateBooleanFirstValue(valueColumn.getBoolean(i), timeColumn.getLong(i)); + return; } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java index 44eb6553c7044..096091ccdb2ed 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java @@ -310,11 +310,11 @@ public void reset() { this.xResult.reset(); } - // TODO can add first position optimization if first position is null ? - private void addIntInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addIntInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateIntFirstValue(xColumn, i, timeColumn.getLong(i)); + return; } } } @@ -341,10 +341,11 @@ protected void updateIntFirstValue(int val, long curTime) { } } - private void addLongInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addLongInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateLongFirstValue(xColumn, i, timeColumn.getLong(i)); + return; } } } @@ -371,10 +372,11 @@ protected void updateLongFirstValue(long value, long curTime) { } } - private void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateFloatFirstValue(xColumn, i, timeColumn.getLong(i)); + return; } } } @@ -401,10 +403,11 @@ protected void updateFloatFirstValue(float value, long curTime) { } } - private void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateDoubleFirstValue(xColumn, i, timeColumn.getLong(i)); + return; } } } @@ -431,10 +434,11 @@ protected void updateDoubleFirstValue(double val, long curTime) { } } - private void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateBinaryFirstValue(xColumn, i, timeColumn.getLong(i)); + return; } } } @@ -461,10 +465,11 @@ protected void updateBinaryFirstValue(Binary val, long curTime) { } } - private void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateBooleanFirstValue(xColumn, i, timeColumn.getLong(i)); + return; } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByDescAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByDescAccumulator.java index 716193da2a046..7f9340e1b3b3d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByDescAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByDescAccumulator.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation; +import org.apache.tsfile.block.column.Column; import org.apache.tsfile.enums.TSDataType; public class FirstByDescAccumulator extends FirstByAccumulator { @@ -32,4 +33,58 @@ public FirstByDescAccumulator( public boolean hasFinalResult() { return false; } + + @Override + protected void addIntInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateIntFirstValue(xColumn, i, timeColumn.getLong(i)); + } + } + } + + @Override + protected void addLongInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateLongFirstValue(xColumn, i, timeColumn.getLong(i)); + } + } + } + + @Override + protected void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateFloatFirstValue(xColumn, i, timeColumn.getLong(i)); + } + } + } + + @Override + protected void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateDoubleFirstValue(xColumn, i, timeColumn.getLong(i)); + } + } + } + + @Override + protected void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateBinaryFirstValue(xColumn, i, timeColumn.getLong(i)); + } + } + } + + @Override + protected void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateBooleanFirstValue(xColumn, i, timeColumn.getLong(i)); + } + } + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstDescAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstDescAccumulator.java index d9e41270878d0..2e2982918e207 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstDescAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstDescAccumulator.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation; +import org.apache.tsfile.block.column.Column; import org.apache.tsfile.enums.TSDataType; public class FirstDescAccumulator extends FirstAccumulator { @@ -31,4 +32,58 @@ public FirstDescAccumulator(TSDataType seriesDataType) { public boolean hasFinalResult() { return false; } + + @Override + protected void addIntInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateIntFirstValue(valueColumn.getInt(i), timeColumn.getLong(i)); + } + } + } + + @Override + protected void addLongInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateLongFirstValue(valueColumn.getLong(i), timeColumn.getLong(i)); + } + } + } + + @Override + protected void addFloatInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateFloatFirstValue(valueColumn.getFloat(i), timeColumn.getLong(i)); + } + } + } + + @Override + protected void addDoubleInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateDoubleFirstValue(valueColumn.getDouble(i), timeColumn.getLong(i)); + } + } + } + + @Override + protected void addBinaryInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateBinaryFirstValue(valueColumn.getBinary(i), timeColumn.getLong(i)); + } + } + } + + @Override + protected void addBooleanInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateBooleanFirstValue(valueColumn.getBoolean(i), timeColumn.getLong(i)); + } + } + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java index 34eee287ad60a..ab9f876d7e34f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java @@ -243,8 +243,7 @@ public void reset() { this.lastValue.reset(); } - private void addIntInput(Column valueColumn, Column timeColumn) { - // TODO can add last position optimization if last position is null ? + protected void addIntInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateIntLastValue(valueColumn.getInt(i), timeColumn.getLong(i)); @@ -260,7 +259,7 @@ protected void updateIntLastValue(int value, long curTime) { } } - private void addLongInput(Column valueColumn, Column timeColumn) { + protected void addLongInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateLongLastValue(valueColumn.getLong(i), timeColumn.getLong(i)); @@ -276,7 +275,7 @@ protected void updateLongLastValue(long value, long curTime) { } } - private void addFloatInput(Column valueColumn, Column timeColumn) { + protected void addFloatInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateFloatLastValue(valueColumn.getFloat(i), timeColumn.getLong(i)); @@ -292,7 +291,7 @@ protected void updateFloatLastValue(float value, long curTime) { } } - private void addDoubleInput(Column valueColumn, Column timeColumn) { + protected void addDoubleInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateDoubleLastValue(valueColumn.getDouble(i), timeColumn.getLong(i)); @@ -308,7 +307,7 @@ protected void updateDoubleLastValue(double value, long curTime) { } } - private void addBinaryInput(Column valueColumn, Column timeColumn) { + protected void addBinaryInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateBinaryLastValue(valueColumn.getBinary(i), timeColumn.getLong(i)); @@ -324,7 +323,7 @@ protected void updateBinaryLastValue(Binary value, long curTime) { } } - private void addBooleanInput(Column valueColumn, Column timeColumn) { + protected void addBooleanInput(Column valueColumn, Column timeColumn) { for (int i = 0; i < valueColumn.getPositionCount(); i++) { if (!valueColumn.isNull(i)) { updateBooleanLastValue(valueColumn.getBoolean(i), timeColumn.getLong(i)); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java index f03a3ab6f77d0..d06f94139337f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByAccumulator.java @@ -42,8 +42,8 @@ public class LastByAccumulator implements TableAccumulator { private static final long INSTANCE_SIZE = RamUsageEstimator.shallowSizeOfInstance(LastByAccumulator.class); - private final TSDataType xDataType; - private final TSDataType yDataType; + protected final TSDataType xDataType; + protected final TSDataType yDataType; private final boolean xIsTimeColumn; private final boolean yIsTimeColumn; @@ -311,7 +311,7 @@ public void reset() { } // TODO can add last position optimization if last position is null ? - private void addIntInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addIntInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateIntLastValue(xColumn, i, timeColumn.getLong(i)); @@ -341,7 +341,7 @@ protected void updateIntLastValue(int val, long curTime) { } } - private void addLongInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addLongInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateLongLastValue(xColumn, i, timeColumn.getLong(i)); @@ -371,7 +371,7 @@ protected void updateLongLastValue(long value, long curTime) { } } - private void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateFloatLastValue(xColumn, i, timeColumn.getLong(i)); @@ -401,7 +401,7 @@ protected void updateFloatLastValue(float value, long curTime) { } } - private void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateDoubleLastValue(xColumn, i, timeColumn.getLong(i)); @@ -431,7 +431,7 @@ protected void updateDoubleLastValue(double val, long curTime) { } } - private void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateBinaryLastValue(xColumn, i, timeColumn.getLong(i)); @@ -461,7 +461,7 @@ protected void updateBinaryLastValue(Binary val, long curTime) { } } - private void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) { + protected void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) { for (int i = 0; i < yColumn.getPositionCount(); i++) { if (!yColumn.isNull(i)) { updateBooleanLastValue(xColumn, i, timeColumn.getLong(i)); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByDescAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByDescAccumulator.java index f858d01d764bf..a44b41d622350 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByDescAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastByDescAccumulator.java @@ -19,9 +19,11 @@ package org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation; +import org.apache.tsfile.block.column.Column; import org.apache.tsfile.enums.TSDataType; public class LastByDescAccumulator extends LastByAccumulator { + public LastByDescAccumulator( TSDataType xDataType, TSDataType yDataType, boolean xIsTimeColumn, boolean yIsTimeColumn) { super(xDataType, yDataType, xIsTimeColumn, yIsTimeColumn); @@ -31,4 +33,64 @@ public LastByDescAccumulator( public boolean hasFinalResult() { return initResult; } + + @Override + protected void addIntInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateIntLastValue(xColumn, i, timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addLongInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateLongLastValue(xColumn, i, timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateFloatLastValue(xColumn, i, timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateDoubleLastValue(xColumn, i, timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateBinaryLastValue(xColumn, i, timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) { + for (int i = 0; i < yColumn.getPositionCount(); i++) { + if (!yColumn.isNull(i)) { + updateBooleanLastValue(xColumn, i, timeColumn.getLong(i)); + return; + } + } + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastDescAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastDescAccumulator.java index 3641d5e23f25b..bc0e97f9b7b36 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastDescAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastDescAccumulator.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation; +import org.apache.tsfile.block.column.Column; import org.apache.tsfile.enums.TSDataType; public class LastDescAccumulator extends LastAccumulator { @@ -31,4 +32,64 @@ public LastDescAccumulator(TSDataType seriesDataType) { public boolean hasFinalResult() { return initResult; } + + @Override + protected void addIntInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateIntLastValue(valueColumn.getInt(i), timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addLongInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateLongLastValue(valueColumn.getLong(i), timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addFloatInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateFloatLastValue(valueColumn.getFloat(i), timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addDoubleInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateDoubleLastValue(valueColumn.getDouble(i), timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addBinaryInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateBinaryLastValue(valueColumn.getBinary(i), timeColumn.getLong(i)); + return; + } + } + } + + @Override + protected void addBooleanInput(Column valueColumn, Column timeColumn) { + for (int i = 0; i < valueColumn.getPositionCount(); i++) { + if (!valueColumn.isNull(i)) { + updateBooleanLastValue(valueColumn.getBoolean(i), timeColumn.getLong(i)); + return; + } + } + } }