Skip to content

Commit 8491391

Browse files
authored
Optimize first, last, first_by, last_by aggregation process in table model
1 parent 34228a9 commit 8491391

File tree

8 files changed

+271
-29
lines changed

8 files changed

+271
-29
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstAccumulator.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,11 @@ public void reset() {
245245
this.firstValue.reset();
246246
}
247247

248-
private void addIntInput(Column valueColumn, Column timeColumn) {
249-
// TODO can add first position optimization if first position is null ?
248+
protected void addIntInput(Column valueColumn, Column timeColumn) {
250249
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
251250
if (!valueColumn.isNull(i)) {
252251
updateIntFirstValue(valueColumn.getInt(i), timeColumn.getLong(i));
252+
return;
253253
}
254254
}
255255
}
@@ -262,10 +262,11 @@ protected void updateIntFirstValue(int value, long curTime) {
262262
}
263263
}
264264

265-
private void addLongInput(Column valueColumn, Column timeColumn) {
265+
protected void addLongInput(Column valueColumn, Column timeColumn) {
266266
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
267267
if (!valueColumn.isNull(i)) {
268268
updateLongFirstValue(valueColumn.getLong(i), timeColumn.getLong(i));
269+
return;
269270
}
270271
}
271272
}
@@ -278,10 +279,11 @@ protected void updateLongFirstValue(long value, long curTime) {
278279
}
279280
}
280281

281-
private void addFloatInput(Column valueColumn, Column timeColumn) {
282+
protected void addFloatInput(Column valueColumn, Column timeColumn) {
282283
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
283284
if (!valueColumn.isNull(i)) {
284285
updateFloatFirstValue(valueColumn.getFloat(i), timeColumn.getLong(i));
286+
return;
285287
}
286288
}
287289
}
@@ -294,10 +296,11 @@ protected void updateFloatFirstValue(float value, long curTime) {
294296
}
295297
}
296298

297-
private void addDoubleInput(Column valueColumn, Column timeColumn) {
299+
protected void addDoubleInput(Column valueColumn, Column timeColumn) {
298300
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
299301
if (!valueColumn.isNull(i)) {
300302
updateDoubleFirstValue(valueColumn.getDouble(i), timeColumn.getLong(i));
303+
return;
301304
}
302305
}
303306
}
@@ -310,10 +313,11 @@ protected void updateDoubleFirstValue(double value, long curTime) {
310313
}
311314
}
312315

313-
private void addBinaryInput(Column valueColumn, Column timeColumn) {
316+
protected void addBinaryInput(Column valueColumn, Column timeColumn) {
314317
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
315318
if (!valueColumn.isNull(i)) {
316319
updateBinaryFirstValue(valueColumn.getBinary(i), timeColumn.getLong(i));
320+
return;
317321
}
318322
}
319323
}
@@ -326,10 +330,11 @@ protected void updateBinaryFirstValue(Binary value, long curTime) {
326330
}
327331
}
328332

329-
private void addBooleanInput(Column valueColumn, Column timeColumn) {
333+
protected void addBooleanInput(Column valueColumn, Column timeColumn) {
330334
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
331335
if (!valueColumn.isNull(i)) {
332336
updateBooleanFirstValue(valueColumn.getBoolean(i), timeColumn.getLong(i));
337+
return;
333338
}
334339
}
335340
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByAccumulator.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -310,11 +310,11 @@ public void reset() {
310310
this.xResult.reset();
311311
}
312312

313-
// TODO can add first position optimization if first position is null ?
314-
private void addIntInput(Column xColumn, Column yColumn, Column timeColumn) {
313+
protected void addIntInput(Column xColumn, Column yColumn, Column timeColumn) {
315314
for (int i = 0; i < yColumn.getPositionCount(); i++) {
316315
if (!yColumn.isNull(i)) {
317316
updateIntFirstValue(xColumn, i, timeColumn.getLong(i));
317+
return;
318318
}
319319
}
320320
}
@@ -341,10 +341,11 @@ protected void updateIntFirstValue(int val, long curTime) {
341341
}
342342
}
343343

344-
private void addLongInput(Column xColumn, Column yColumn, Column timeColumn) {
344+
protected void addLongInput(Column xColumn, Column yColumn, Column timeColumn) {
345345
for (int i = 0; i < yColumn.getPositionCount(); i++) {
346346
if (!yColumn.isNull(i)) {
347347
updateLongFirstValue(xColumn, i, timeColumn.getLong(i));
348+
return;
348349
}
349350
}
350351
}
@@ -371,10 +372,11 @@ protected void updateLongFirstValue(long value, long curTime) {
371372
}
372373
}
373374

374-
private void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) {
375+
protected void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) {
375376
for (int i = 0; i < yColumn.getPositionCount(); i++) {
376377
if (!yColumn.isNull(i)) {
377378
updateFloatFirstValue(xColumn, i, timeColumn.getLong(i));
379+
return;
378380
}
379381
}
380382
}
@@ -401,10 +403,11 @@ protected void updateFloatFirstValue(float value, long curTime) {
401403
}
402404
}
403405

404-
private void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) {
406+
protected void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) {
405407
for (int i = 0; i < yColumn.getPositionCount(); i++) {
406408
if (!yColumn.isNull(i)) {
407409
updateDoubleFirstValue(xColumn, i, timeColumn.getLong(i));
410+
return;
408411
}
409412
}
410413
}
@@ -431,10 +434,11 @@ protected void updateDoubleFirstValue(double val, long curTime) {
431434
}
432435
}
433436

434-
private void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) {
437+
protected void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) {
435438
for (int i = 0; i < yColumn.getPositionCount(); i++) {
436439
if (!yColumn.isNull(i)) {
437440
updateBinaryFirstValue(xColumn, i, timeColumn.getLong(i));
441+
return;
438442
}
439443
}
440444
}
@@ -461,10 +465,11 @@ protected void updateBinaryFirstValue(Binary val, long curTime) {
461465
}
462466
}
463467

464-
private void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) {
468+
protected void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) {
465469
for (int i = 0; i < yColumn.getPositionCount(); i++) {
466470
if (!yColumn.isNull(i)) {
467471
updateBooleanFirstValue(xColumn, i, timeColumn.getLong(i));
472+
return;
468473
}
469474
}
470475
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstByDescAccumulator.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation;
2121

22+
import org.apache.tsfile.block.column.Column;
2223
import org.apache.tsfile.enums.TSDataType;
2324

2425
public class FirstByDescAccumulator extends FirstByAccumulator {
@@ -32,4 +33,58 @@ public FirstByDescAccumulator(
3233
public boolean hasFinalResult() {
3334
return false;
3435
}
36+
37+
@Override
38+
protected void addIntInput(Column xColumn, Column yColumn, Column timeColumn) {
39+
for (int i = 0; i < yColumn.getPositionCount(); i++) {
40+
if (!yColumn.isNull(i)) {
41+
updateIntFirstValue(xColumn, i, timeColumn.getLong(i));
42+
}
43+
}
44+
}
45+
46+
@Override
47+
protected void addLongInput(Column xColumn, Column yColumn, Column timeColumn) {
48+
for (int i = 0; i < yColumn.getPositionCount(); i++) {
49+
if (!yColumn.isNull(i)) {
50+
updateLongFirstValue(xColumn, i, timeColumn.getLong(i));
51+
}
52+
}
53+
}
54+
55+
@Override
56+
protected void addFloatInput(Column xColumn, Column yColumn, Column timeColumn) {
57+
for (int i = 0; i < yColumn.getPositionCount(); i++) {
58+
if (!yColumn.isNull(i)) {
59+
updateFloatFirstValue(xColumn, i, timeColumn.getLong(i));
60+
}
61+
}
62+
}
63+
64+
@Override
65+
protected void addDoubleInput(Column xColumn, Column yColumn, Column timeColumn) {
66+
for (int i = 0; i < yColumn.getPositionCount(); i++) {
67+
if (!yColumn.isNull(i)) {
68+
updateDoubleFirstValue(xColumn, i, timeColumn.getLong(i));
69+
}
70+
}
71+
}
72+
73+
@Override
74+
protected void addBinaryInput(Column xColumn, Column yColumn, Column timeColumn) {
75+
for (int i = 0; i < yColumn.getPositionCount(); i++) {
76+
if (!yColumn.isNull(i)) {
77+
updateBinaryFirstValue(xColumn, i, timeColumn.getLong(i));
78+
}
79+
}
80+
}
81+
82+
@Override
83+
protected void addBooleanInput(Column xColumn, Column yColumn, Column timeColumn) {
84+
for (int i = 0; i < yColumn.getPositionCount(); i++) {
85+
if (!yColumn.isNull(i)) {
86+
updateBooleanFirstValue(xColumn, i, timeColumn.getLong(i));
87+
}
88+
}
89+
}
3590
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/FirstDescAccumulator.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation;
2121

22+
import org.apache.tsfile.block.column.Column;
2223
import org.apache.tsfile.enums.TSDataType;
2324

2425
public class FirstDescAccumulator extends FirstAccumulator {
@@ -31,4 +32,58 @@ public FirstDescAccumulator(TSDataType seriesDataType) {
3132
public boolean hasFinalResult() {
3233
return false;
3334
}
35+
36+
@Override
37+
protected void addIntInput(Column valueColumn, Column timeColumn) {
38+
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
39+
if (!valueColumn.isNull(i)) {
40+
updateIntFirstValue(valueColumn.getInt(i), timeColumn.getLong(i));
41+
}
42+
}
43+
}
44+
45+
@Override
46+
protected void addLongInput(Column valueColumn, Column timeColumn) {
47+
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
48+
if (!valueColumn.isNull(i)) {
49+
updateLongFirstValue(valueColumn.getLong(i), timeColumn.getLong(i));
50+
}
51+
}
52+
}
53+
54+
@Override
55+
protected void addFloatInput(Column valueColumn, Column timeColumn) {
56+
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
57+
if (!valueColumn.isNull(i)) {
58+
updateFloatFirstValue(valueColumn.getFloat(i), timeColumn.getLong(i));
59+
}
60+
}
61+
}
62+
63+
@Override
64+
protected void addDoubleInput(Column valueColumn, Column timeColumn) {
65+
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
66+
if (!valueColumn.isNull(i)) {
67+
updateDoubleFirstValue(valueColumn.getDouble(i), timeColumn.getLong(i));
68+
}
69+
}
70+
}
71+
72+
@Override
73+
protected void addBinaryInput(Column valueColumn, Column timeColumn) {
74+
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
75+
if (!valueColumn.isNull(i)) {
76+
updateBinaryFirstValue(valueColumn.getBinary(i), timeColumn.getLong(i));
77+
}
78+
}
79+
}
80+
81+
@Override
82+
protected void addBooleanInput(Column valueColumn, Column timeColumn) {
83+
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
84+
if (!valueColumn.isNull(i)) {
85+
updateBooleanFirstValue(valueColumn.getBoolean(i), timeColumn.getLong(i));
86+
}
87+
}
88+
}
3489
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/LastAccumulator.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,7 @@ public void reset() {
243243
this.lastValue.reset();
244244
}
245245

246-
private void addIntInput(Column valueColumn, Column timeColumn) {
247-
// TODO can add last position optimization if last position is null ?
246+
protected void addIntInput(Column valueColumn, Column timeColumn) {
248247
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
249248
if (!valueColumn.isNull(i)) {
250249
updateIntLastValue(valueColumn.getInt(i), timeColumn.getLong(i));
@@ -260,7 +259,7 @@ protected void updateIntLastValue(int value, long curTime) {
260259
}
261260
}
262261

263-
private void addLongInput(Column valueColumn, Column timeColumn) {
262+
protected void addLongInput(Column valueColumn, Column timeColumn) {
264263
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
265264
if (!valueColumn.isNull(i)) {
266265
updateLongLastValue(valueColumn.getLong(i), timeColumn.getLong(i));
@@ -276,7 +275,7 @@ protected void updateLongLastValue(long value, long curTime) {
276275
}
277276
}
278277

279-
private void addFloatInput(Column valueColumn, Column timeColumn) {
278+
protected void addFloatInput(Column valueColumn, Column timeColumn) {
280279
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
281280
if (!valueColumn.isNull(i)) {
282281
updateFloatLastValue(valueColumn.getFloat(i), timeColumn.getLong(i));
@@ -292,7 +291,7 @@ protected void updateFloatLastValue(float value, long curTime) {
292291
}
293292
}
294293

295-
private void addDoubleInput(Column valueColumn, Column timeColumn) {
294+
protected void addDoubleInput(Column valueColumn, Column timeColumn) {
296295
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
297296
if (!valueColumn.isNull(i)) {
298297
updateDoubleLastValue(valueColumn.getDouble(i), timeColumn.getLong(i));
@@ -308,7 +307,7 @@ protected void updateDoubleLastValue(double value, long curTime) {
308307
}
309308
}
310309

311-
private void addBinaryInput(Column valueColumn, Column timeColumn) {
310+
protected void addBinaryInput(Column valueColumn, Column timeColumn) {
312311
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
313312
if (!valueColumn.isNull(i)) {
314313
updateBinaryLastValue(valueColumn.getBinary(i), timeColumn.getLong(i));
@@ -324,7 +323,7 @@ protected void updateBinaryLastValue(Binary value, long curTime) {
324323
}
325324
}
326325

327-
private void addBooleanInput(Column valueColumn, Column timeColumn) {
326+
protected void addBooleanInput(Column valueColumn, Column timeColumn) {
328327
for (int i = 0; i < valueColumn.getPositionCount(); i++) {
329328
if (!valueColumn.isNull(i)) {
330329
updateBooleanLastValue(valueColumn.getBoolean(i), timeColumn.getLong(i));

0 commit comments

Comments
 (0)