Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@

@RunWith(IoTDBTestRunner.class)
@Category({TableLocalStandaloneIT.class, TableClusterIT.class})
public class IoTDBObjectQueryIT2 {
public class IoTDBObjectQuery2IT {

private static final String DATABASE_NAME = "test";

Expand Down Expand Up @@ -116,6 +116,7 @@ public void testReadObject() throws IoTDBConnectionException, StatementExecution
Binary blob = iterator.getBlob(1);
Assert.assertArrayEquals(expected, blob.getValues());
}
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
Expand All @@ -126,6 +127,7 @@ public void testReadObject() throws IoTDBConnectionException, StatementExecution
Binary blob = iterator.getBlob(1);
Assert.assertArrayEquals(expected, blob.getValues());
}
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
Expand All @@ -136,6 +138,7 @@ public void testReadObject() throws IoTDBConnectionException, StatementExecution
Binary blob = iterator.getBlob(1);
Assert.assertArrayEquals(expected, blob.getValues());
}
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
Expand All @@ -145,6 +148,7 @@ public void testReadObject() throws IoTDBConnectionException, StatementExecution
long count = iterator.getLong(1);
Assert.assertEquals(10, count);
}
sessionDataSet.close();

// read_object are not pushed down. Read remote files
sessionDataSet =
Expand All @@ -156,6 +160,7 @@ public void testReadObject() throws IoTDBConnectionException, StatementExecution
Binary blob = iterator.getBlob(1);
Assert.assertArrayEquals(expected, blob.getValues());
}
sessionDataSet.close();
}
}

Expand All @@ -172,6 +177,8 @@ public void testFunctionAndClauses()
while (iterator.next()) {
Assert.assertEquals(4, iterator.getLong(1));
}
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
"select count(s8), first(s8), last(s8), first_by(s8, time), last_by(s8, time) from table1 where device = 'd1' and cast(s8 as string) = '(Object) 4 B' and try_cast(s8 as string) = '(Object) 4 B'");
Expand All @@ -183,12 +190,14 @@ public void testFunctionAndClauses()
Assert.assertEquals("(Object) 4 B", iterator.getString(4));
Assert.assertEquals("(Object) 4 B", iterator.getString(5));
}
sessionDataSet.close();

sessionDataSet = session.executeQueryStatement("select coalesce(s9, s8) from table1");
iterator = sessionDataSet.iterator();
while (iterator.next()) {
Assert.assertEquals("(Object) 4 B", iterator.getString(1));
}
sessionDataSet.close();

// MATCH_RECOGNIZE
Assert.assertThrows(
Expand All @@ -209,6 +218,7 @@ public void testFunctionAndClauses()
while (iterator.next()) {
Assert.assertEquals("(Object) 4 B", iterator.getString(1));
}
sessionDataSet.close();

// WHERE
session.executeQueryStatement(
Expand All @@ -217,71 +227,90 @@ public void testFunctionAndClauses()
while (iterator.next()) {
Assert.assertEquals("(Object) 4 B", iterator.getString(2));
}
sessionDataSet.close();

// GROUP BY
Assert.assertThrows(
StatementExecutionException.class,
() -> session.executeNonQueryStatement("select count(*) from table1 group by s8"));
() -> session.executeQueryStatement("select count(*) from table1 group by s8"));

// ORDER BY
Assert.assertThrows(
StatementExecutionException.class,
() -> session.executeNonQueryStatement("select count(*) from table1 order by s8"));
() -> session.executeQueryStatement("select count(*) from table1 order by s8"));

// FILL
Assert.assertThrows(
StatementExecutionException.class,
() ->
session.executeNonQueryStatement(
"select time, s8 from table1 where device = 'd10' fill method linear"));
session.executeQueryStatement(
"select time, s8 from table1 where device = 'd10' fill method previous");
sessionDataSet =
session.executeQueryStatement(
"select time, s8 from table1 where device = 'd10' fill method linear");
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
"select time, s8 from table1 where device = 'd10' fill method previous");
iterator = sessionDataSet.iterator();
while (iterator.next()) {
Assert.assertEquals("(Object) 4 B", iterator.getString(2));
}
sessionDataSet.close();

// HAVING
session.executeQueryStatement(
"select device, count(s8) from table1 group by device having count(s8) > 0");
sessionDataSet =
session.executeQueryStatement(
"select device, count(s8) from table1 group by device having count(s8) > 0");
iterator = sessionDataSet.iterator();
while (iterator.next()) {
long count = iterator.getLong(2);
Assert.assertEquals(10, count);
}
sessionDataSet.close();

// WINDOW
Assert.assertThrows(
StatementExecutionException.class,
() ->
session.executeNonQueryStatement(
session.executeQueryStatement(
"select *, nth_value(s8,2) over(partition by s8) from table1"));
Assert.assertThrows(
StatementExecutionException.class,
() ->
session.executeNonQueryStatement(
session.executeQueryStatement(
"select *, nth_value(s8,2) over(order by s8) from table1"));
session.executeNonQueryStatement(
"select *, nth_value(s8,2) over(partition by device) from table1");
session.executeNonQueryStatement(
"select *, lead(s8) over(partition by device order by time) from table1");
session.executeNonQueryStatement(
"select *, first_value(s8) over(partition by device) from table1");
session.executeNonQueryStatement(
"select *, last_value(s8) over(partition by device) from table1");
session.executeNonQueryStatement(
"select *, lag(s8) over(partition by device order by time) from table1");
sessionDataSet =
session.executeQueryStatement(
"select *, nth_value(s8,2) over(partition by device) from table1");
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
"select *, lead(s8) over(partition by device order by time) from table1");
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
"select *, first_value(s8) over(partition by device) from table1");
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
"select *, last_value(s8) over(partition by device) from table1");
sessionDataSet.close();

sessionDataSet =
session.executeQueryStatement(
"select *, lag(s8) over(partition by device order by time) from table1");
sessionDataSet.close();

// Table-value function
Assert.assertThrows(
StatementExecutionException.class,
() ->
session.executeNonQueryStatement(
session.executeQueryStatement(
"select * from session(data => table1 partition by s8, timecol => 'time', gap => 1ms)"));
Assert.assertThrows(
StatementExecutionException.class,
() ->
session.executeNonQueryStatement(
session.executeQueryStatement(
"select * from session(data => table1 order by s8, timecol => 'time', gap => 1ms)"));
sessionDataSet =
session.executeQueryStatement(
Expand All @@ -291,6 +320,7 @@ public void testFunctionAndClauses()
String str = iterator.getString("s8");
Assert.assertEquals("(Object) 4 B", str);
}
sessionDataSet.close();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,15 @@ public class IoTDBObjectQueryIT {
new String[] {
"CREATE DATABASE " + DATABASE_NAME,
"USE " + DATABASE_NAME,
"CREATE TABLE t1(device_id STRING TAG, o1 OBJECT, b1 BLOB, s1 STRING)",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(1, 'd1', X'cafebabe01', to_object(true, 0, X'cafebabe01'), 'cafebabe01')",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(2, 'd1', X'cafebabe0202', to_object(true, 0, X'cafebabe02'), 'cafebabe02')",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(3, 'd1', X'cafebabe0303', to_object(true, 0, X'cafebabe03'), 'cafebabe03')",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(4, 'd1', X'cafebabe04', to_object(true, 0, X'cafebabe04'), 'cafebabe04')",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(1, 'd2', X'cafebade01', to_object(true, 0, X'cafebade01'), 'cafebade01')",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(2, 'd2', X'cafebade0202', to_object(true, 0, X'cafebade02'), 'cafebade02')",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(3, 'd2', X'cafebade0302', to_object(true, 0, X'cafebade03'), 'cafebade03')",
"INSERT INTO t1(time, device_id, b1, o1, s1) VALUES(4, 'd2', X'cafebade04', to_object(true, 0, X'cafebade04'), 'cafebade04')",
"CREATE TABLE t1(device_id STRING TAG, o1 OBJECT, b1 BLOB, s1 STRING, l1 INT64, l2 INT64)",
"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)",
"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)",
"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)",
"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)",
"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)",
"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)",
"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)",
"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)",
"FLUSH",
};

Expand Down Expand Up @@ -134,6 +134,83 @@ public void jdbcTest() {
}
assertEquals(2, cnt);
}

try (ResultSet resultSet =
statement.executeQuery(
"SELECT time, b1, READ_OBJECT(o1, 0, -1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
int cnt = 0;
String[] ans = {"0xcafebade01", "0xcafebade04"};
while (resultSet.next()) {
String s = resultSet.getString(3);
assertEquals(ans[cnt], s);
cnt++;
}
assertEquals(2, cnt);
}

try (ResultSet resultSet =
statement.executeQuery(
"SELECT time, b1, READ_OBJECT(o1, l1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
int cnt = 0;
String[] ans = {"0xcafebade01", "0xcafebade04"};
while (resultSet.next()) {
String s = resultSet.getString(3);
assertEquals(ans[cnt], s);
cnt++;
}
assertEquals(2, cnt);
}

try (ResultSet resultSet =
statement.executeQuery(
"SELECT time, b1, READ_OBJECT(o1, l1, l2), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
int cnt = 0;
String[] ans = {"0xcafebade01", "0xcafebade04"};
while (resultSet.next()) {
String s = resultSet.getString(3);
assertEquals(ans[cnt], s);
cnt++;
}
assertEquals(2, cnt);
}

try (ResultSet resultSet =
statement.executeQuery(
"SELECT time, b1, READ_OBJECT(o1, l1, -1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
int cnt = 0;
String[] ans = {"0xcafebade01", "0xcafebade04"};
while (resultSet.next()) {
String s = resultSet.getString(3);
assertEquals(ans[cnt], s);
cnt++;
}
assertEquals(2, cnt);
}

try (ResultSet resultSet =
statement.executeQuery(
"SELECT time, b1, READ_OBJECT(o1, 0, l2), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) {
int cnt = 0;
String[] ans = {"0xcafebade01", "0xcafebade04"};
while (resultSet.next()) {
String s = resultSet.getString(3);
assertEquals(ans[cnt], s);
cnt++;
}
assertEquals(2, cnt);
}

try (ResultSet resultSet =
statement.executeQuery(
"SELECT time, b1, o1, s1 FROM t1 WHERE device_id = 'd1' FILL METHOD LINEAR")) {
int cnt = 0;
while (resultSet.next()) {
cnt++;
String s = resultSet.getString(3);
assertEquals("(Object) 5 B", s);
}
assertEquals(4, cnt);
}
}
} catch (SQLException e) {
e.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.CompareNonEqualColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.HmacColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.Like2ColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ReadObject2ColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.factory.HmacStrategiesFactory;
import org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.ConstantColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.IdentityColumnTransformer;
Expand All @@ -105,6 +106,7 @@
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.BetweenColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.Like3ColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.LpadColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.ReadObject3ColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.RpadColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.udf.UserDefineScalarFunctionTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.IsNullColumnTransformer;
Expand Down Expand Up @@ -1467,21 +1469,31 @@ private ColumnTransformer getFunctionColumnTransformer(
if (children.size() == 1) {
return new ReadObjectColumnTransformer(BLOB, first, context.fragmentInstanceContext);
} else if (children.size() == 2) {
return new ReadObjectColumnTransformer(
BLOB,
((LongLiteral) children.get(1)).getParsedValue(),
first,
context.fragmentInstanceContext);
Expression offset = children.get(1);
if (isLongLiteral(offset)) {
return new ReadObjectColumnTransformer(
BLOB,
((LongLiteral) children.get(1)).getParsedValue(),
first,
context.fragmentInstanceContext);
} else {
return new ReadObject2ColumnTransformer(
BLOB, first, this.process(offset, context), context.fragmentInstanceContext);
}
} else {
long offset = ((LongLiteral) children.get(1)).getParsedValue();
long length = ((LongLiteral) children.get(2)).getParsedValue();
checkArgument(offset >= 0 && length >= 0);
return new ReadObjectColumnTransformer(
BLOB,
((LongLiteral) children.get(1)).getParsedValue(),
((LongLiteral) children.get(2)).getParsedValue(),
first,
context.fragmentInstanceContext);
if (isLongLiteral(children.get(1)) && isLongLiteral(children.get(2))) {
long offset = ((LongLiteral) children.get(1)).getParsedValue();
long length = ((LongLiteral) children.get(2)).getParsedValue();
return new ReadObjectColumnTransformer(
BLOB, offset, length, first, context.fragmentInstanceContext);
} else {
return new ReadObject3ColumnTransformer(
BLOB,
first,
this.process(children.get(1), context),
this.process(children.get(2), context),
context.fragmentInstanceContext);
}
}
} else {
// user defined function
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1494,6 +1494,7 @@ public static ILinearFill[] getLinearFill(int inputColumns, List<TSDataType> inp
case TEXT:
case STRING:
case BLOB:
case OBJECT:
linearFill[i] = IDENTITY_LINEAR_FILL;
break;
default:
Expand Down
Loading
Loading