Skip to content

Commit 0d7adf6

Browse files
committed
Support second and third parameter of read_object are not constant
1 parent 1e19eae commit 0d7adf6

File tree

7 files changed

+308
-29
lines changed

7 files changed

+308
-29
lines changed

integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQueryIT2.java renamed to integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQuery2IT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
@RunWith(IoTDBTestRunner.class)
4545
@Category({TableLocalStandaloneIT.class, TableClusterIT.class})
46-
public class IoTDBObjectQueryIT2 {
46+
public class IoTDBObjectQuery2IT {
4747

4848
private static final String DATABASE_NAME = "test";
4949

integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQueryIT.java

Lines changed: 86 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,15 @@ public class IoTDBObjectQueryIT {
6262
new String[] {
6363
"CREATE DATABASE " + DATABASE_NAME,
6464
"USE " + DATABASE_NAME,
65-
"CREATE TABLE t1(device_id STRING TAG, o1 OBJECT, b1 BLOB, s1 STRING)",
66-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(1, 'd1', X'cafebabe01', to_object(true, 0, X'cafebabe01'), 'cafebabe01')",
67-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(2, 'd1', X'cafebabe0202', to_object(true, 0, X'cafebabe02'), 'cafebabe02')",
68-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(3, 'd1', X'cafebabe0303', to_object(true, 0, X'cafebabe03'), 'cafebabe03')",
69-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(4, 'd1', X'cafebabe04', to_object(true, 0, X'cafebabe04'), 'cafebabe04')",
70-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(1, 'd2', X'cafebade01', to_object(true, 0, X'cafebade01'), 'cafebade01')",
71-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(2, 'd2', X'cafebade0202', to_object(true, 0, X'cafebade02'), 'cafebade02')",
72-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(3, 'd2', X'cafebade0302', to_object(true, 0, X'cafebade03'), 'cafebade03')",
73-
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(4, 'd2', X'cafebade04', to_object(true, 0, X'cafebade04'), 'cafebade04')",
65+
"CREATE TABLE t1(device_id STRING TAG, o1 OBJECT, b1 BLOB, s1 STRING, l1 INT64, l2 INT64)",
66+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', to_object(true, 0, X'cafebabe01'), 'cafebabe01', 0, 100)",
67+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(2, 'd1', X'cafebabe0202', to_object(true, 0, X'cafebabe02'), 'cafebabe02', 0, 100)",
68+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(3, 'd1', X'cafebabe0303', to_object(true, 0, X'cafebabe03'), 'cafebabe03', 0, 100)",
69+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(4, 'd1', X'cafebabe04', to_object(true, 0, X'cafebabe04'), 'cafebabe04', 0, 100)",
70+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd2', X'cafebade01', to_object(true, 0, X'cafebade01'), 'cafebade01', 0, 100)",
71+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(2, 'd2', X'cafebade0202', to_object(true, 0, X'cafebade02'), 'cafebade02', 0, 100)",
72+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(3, 'd2', X'cafebade0302', to_object(true, 0, X'cafebade03'), 'cafebade03', 0, 100)",
73+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(4, 'd2', X'cafebade04', to_object(true, 0, X'cafebade04'), 'cafebade04', 0, 100)",
7474
"FLUSH",
7575
};
7676

@@ -134,6 +134,83 @@ public void jdbcTest() {
134134
}
135135
assertEquals(2, cnt);
136136
}
137+
138+
try (ResultSet resultSet =
139+
statement.executeQuery(
140+
"SELECT time, b1, READ_OBJECT(o1, 0, -1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
141+
int cnt = 0;
142+
String[] ans = {"0xcafebade01", "0xcafebade04"};
143+
while (resultSet.next()) {
144+
String s = resultSet.getString(3);
145+
assertEquals(ans[cnt], s);
146+
cnt++;
147+
}
148+
assertEquals(2, cnt);
149+
}
150+
151+
try (ResultSet resultSet =
152+
statement.executeQuery(
153+
"SELECT time, b1, READ_OBJECT(o1, l1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
154+
int cnt = 0;
155+
String[] ans = {"0xcafebade01", "0xcafebade04"};
156+
while (resultSet.next()) {
157+
String s = resultSet.getString(3);
158+
assertEquals(ans[cnt], s);
159+
cnt++;
160+
}
161+
assertEquals(2, cnt);
162+
}
163+
164+
try (ResultSet resultSet =
165+
statement.executeQuery(
166+
"SELECT time, b1, READ_OBJECT(o1, l1, l2), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
167+
int cnt = 0;
168+
String[] ans = {"0xcafebade01", "0xcafebade04"};
169+
while (resultSet.next()) {
170+
String s = resultSet.getString(3);
171+
assertEquals(ans[cnt], s);
172+
cnt++;
173+
}
174+
assertEquals(2, cnt);
175+
}
176+
177+
try (ResultSet resultSet =
178+
statement.executeQuery(
179+
"SELECT time, b1, READ_OBJECT(o1, l1, -1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
180+
int cnt = 0;
181+
String[] ans = {"0xcafebade01", "0xcafebade04"};
182+
while (resultSet.next()) {
183+
String s = resultSet.getString(3);
184+
assertEquals(ans[cnt], s);
185+
cnt++;
186+
}
187+
assertEquals(2, cnt);
188+
}
189+
190+
try (ResultSet resultSet =
191+
statement.executeQuery(
192+
"SELECT time, b1, READ_OBJECT(o1, 0, l2), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
193+
int cnt = 0;
194+
String[] ans = {"0xcafebade01", "0xcafebade04"};
195+
while (resultSet.next()) {
196+
String s = resultSet.getString(3);
197+
assertEquals(ans[cnt], s);
198+
cnt++;
199+
}
200+
assertEquals(2, cnt);
201+
}
202+
203+
try (ResultSet resultSet =
204+
statement.executeQuery(
205+
"SELECT time, b1, o1, s1 FROM t1 WHERE device_id = 'd1' FILL METHOD LINEAR")) {
206+
int cnt = 0;
207+
while (resultSet.next()) {
208+
cnt++;
209+
String s = resultSet.getString(3);
210+
assertEquals("(Object) 5 B", s);
211+
}
212+
assertEquals(4, cnt);
213+
}
137214
}
138215
} catch (SQLException e) {
139216
e.printStackTrace();

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.CompareNonEqualColumnTransformer;
8686
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.HmacColumnTransformer;
8787
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.Like2ColumnTransformer;
88+
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ReadObject2ColumnTransformer;
8889
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.factory.HmacStrategiesFactory;
8990
import org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.ConstantColumnTransformer;
9091
import org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.IdentityColumnTransformer;
@@ -105,6 +106,7 @@
105106
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.BetweenColumnTransformer;
106107
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.Like3ColumnTransformer;
107108
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.LpadColumnTransformer;
109+
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.ReadObject3ColumnTransformer;
108110
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.RpadColumnTransformer;
109111
import org.apache.iotdb.db.queryengine.transformation.dag.column.udf.UserDefineScalarFunctionTransformer;
110112
import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.IsNullColumnTransformer;
@@ -1467,21 +1469,31 @@ private ColumnTransformer getFunctionColumnTransformer(
14671469
if (children.size() == 1) {
14681470
return new ReadObjectColumnTransformer(BLOB, first, context.fragmentInstanceContext);
14691471
} else if (children.size() == 2) {
1470-
return new ReadObjectColumnTransformer(
1471-
BLOB,
1472-
((LongLiteral) children.get(1)).getParsedValue(),
1473-
first,
1474-
context.fragmentInstanceContext);
1472+
Expression offset = children.get(1);
1473+
if (isLongLiteral(offset)) {
1474+
return new ReadObjectColumnTransformer(
1475+
BLOB,
1476+
((LongLiteral) children.get(1)).getParsedValue(),
1477+
first,
1478+
context.fragmentInstanceContext);
1479+
} else {
1480+
return new ReadObject2ColumnTransformer(
1481+
BLOB, first, this.process(offset, context), context.fragmentInstanceContext);
1482+
}
14751483
} else {
1476-
long offset = ((LongLiteral) children.get(1)).getParsedValue();
1477-
long length = ((LongLiteral) children.get(2)).getParsedValue();
1478-
checkArgument(offset >= 0 && length >= 0);
1479-
return new ReadObjectColumnTransformer(
1480-
BLOB,
1481-
((LongLiteral) children.get(1)).getParsedValue(),
1482-
((LongLiteral) children.get(2)).getParsedValue(),
1483-
first,
1484-
context.fragmentInstanceContext);
1484+
if (isLongLiteral(children.get(1)) && isLongLiteral(children.get(2))) {
1485+
long offset = ((LongLiteral) children.get(1)).getParsedValue();
1486+
long length = ((LongLiteral) children.get(2)).getParsedValue();
1487+
return new ReadObjectColumnTransformer(
1488+
BLOB, offset, length, first, context.fragmentInstanceContext);
1489+
} else {
1490+
return new ReadObject3ColumnTransformer(
1491+
BLOB,
1492+
first,
1493+
this.process(children.get(1), context),
1494+
this.process(children.get(2), context),
1495+
context.fragmentInstanceContext);
1496+
}
14851497
}
14861498
} else {
14871499
// user defined function

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,7 @@ public static ILinearFill[] getLinearFill(int inputColumns, List<TSDataType> inp
14941494
case TEXT:
14951495
case STRING:
14961496
case BLOB:
1497+
case OBJECT:
14971498
linearFill[i] = IDENTITY_LINEAR_FILL;
14981499
break;
14991500
default:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.iotdb.db.queryengine.transformation.dag.column.binary;
21+
22+
import org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext;
23+
import org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
24+
25+
import org.apache.tsfile.block.column.Column;
26+
import org.apache.tsfile.block.column.ColumnBuilder;
27+
import org.apache.tsfile.read.common.type.Type;
28+
29+
import java.util.Optional;
30+
31+
import static org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.ReadObjectColumnTransformer.transform;
32+
33+
public class ReadObject2ColumnTransformer extends BinaryColumnTransformer {
34+
35+
private final Optional<FragmentInstanceContext> fragmentInstanceContext;
36+
37+
public ReadObject2ColumnTransformer(
38+
Type returnType,
39+
ColumnTransformer leftTransformer,
40+
ColumnTransformer rightTransformer,
41+
Optional<FragmentInstanceContext> fragmentInstanceContext) {
42+
super(returnType, leftTransformer, rightTransformer);
43+
this.fragmentInstanceContext = fragmentInstanceContext;
44+
}
45+
46+
@Override
47+
protected void doTransform(
48+
Column leftColumn, Column rightColumn, ColumnBuilder builder, int positionCount) {
49+
for (int i = 0; i < positionCount; i++) {
50+
if (!leftColumn.isNull(i) && !rightColumn.isNull(i)) {
51+
transform(leftColumn, builder, i, rightColumn.getLong(i), -1, this.fragmentInstanceContext);
52+
} else {
53+
builder.appendNull();
54+
}
55+
}
56+
}
57+
58+
@Override
59+
protected void doTransform(
60+
Column leftColumn,
61+
Column rightColumn,
62+
ColumnBuilder builder,
63+
int positionCount,
64+
boolean[] selection) {
65+
for (int i = 0; i < positionCount; i++) {
66+
if (selection[i] && !leftColumn.isNull(i) && !rightColumn.isNull(i)) {
67+
transform(leftColumn, builder, i, rightColumn.getLong(i), -1, this.fragmentInstanceContext);
68+
} else {
69+
builder.appendNull();
70+
}
71+
}
72+
}
73+
74+
@Override
75+
protected void checkType() {
76+
// do nothing
77+
}
78+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.iotdb.db.queryengine.transformation.dag.column.ternary;
21+
22+
import org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext;
23+
import org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
24+
25+
import org.apache.tsfile.block.column.Column;
26+
import org.apache.tsfile.block.column.ColumnBuilder;
27+
import org.apache.tsfile.read.common.type.Type;
28+
29+
import java.util.Optional;
30+
31+
import static org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.ReadObjectColumnTransformer.transform;
32+
33+
public class ReadObject3ColumnTransformer extends TernaryColumnTransformer {
34+
35+
private final Optional<FragmentInstanceContext> fragmentInstanceContext;
36+
37+
public ReadObject3ColumnTransformer(
38+
Type retuenType,
39+
ColumnTransformer firstColumnTransformer,
40+
ColumnTransformer secondColumnTransformer,
41+
ColumnTransformer thirdColumnTransformer,
42+
Optional<FragmentInstanceContext> fragmentInstanceContext) {
43+
super(retuenType, firstColumnTransformer, secondColumnTransformer, thirdColumnTransformer);
44+
this.fragmentInstanceContext = fragmentInstanceContext;
45+
}
46+
47+
@Override
48+
protected void checkType() {
49+
// do nothing
50+
}
51+
52+
@Override
53+
protected void doTransform(
54+
Column firstColumn,
55+
Column secondColumn,
56+
Column thirdColumn,
57+
ColumnBuilder builder,
58+
int positionCount) {
59+
for (int i = 0; i < positionCount; i++) {
60+
if (!firstColumn.isNull(i) && !secondColumn.isNull(i) && !thirdColumn.isNull(i)) {
61+
transform(
62+
firstColumn,
63+
builder,
64+
i,
65+
secondColumn.getLong(i),
66+
thirdColumn.getLong(i),
67+
this.fragmentInstanceContext);
68+
} else {
69+
builder.appendNull();
70+
}
71+
}
72+
}
73+
74+
@Override
75+
protected void doTransform(
76+
Column firstColumn,
77+
Column secondColumn,
78+
Column thirdColumn,
79+
ColumnBuilder builder,
80+
int positionCount,
81+
boolean[] selection) {
82+
for (int i = 0; i < positionCount; i++) {
83+
if (selection[i]
84+
&& !firstColumn.isNull(i)
85+
&& !secondColumn.isNull(i)
86+
&& !thirdColumn.isNull(i)) {
87+
transform(
88+
firstColumn,
89+
builder,
90+
i,
91+
secondColumn.getLong(i),
92+
thirdColumn.getLong(i),
93+
this.fragmentInstanceContext);
94+
} else {
95+
builder.appendNull();
96+
}
97+
}
98+
}
99+
}

0 commit comments

Comments
 (0)