Skip to content

Commit bdeb94a

Browse files
committed
Add aligned stream pipe type conversion IT
1 parent 17190aa commit bdeb94a

1 file changed

Lines changed: 115 additions & 22 deletions

File tree

integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeTypeConversionSemanticIT.java

Lines changed: 115 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@
4141
public class IoTDBPipeTypeConversionSemanticIT extends AbstractPipeDualTreeModelAutoIT {
4242

4343
private static final String DEVICE = "root.pipe_type_conversion.d";
44+
private static final String ALIGNED_DEVICE = "root.pipe_type_conversion.aligned_d";
45+
private static final List<TypeConversionSemanticCase> ALIGNED_STREAM_CASES =
46+
getCases(
47+
"bool_to_int32",
48+
"bool_to_int64",
49+
"bool_to_float",
50+
"bool_to_double",
51+
"bool_to_blob",
52+
"bool_to_date",
53+
"bool_to_timestamp",
54+
"int32_to_boolean",
55+
"int32_to_timestamp",
56+
"int32_to_date");
4457

4558
@Override
4659
@Before
@@ -70,33 +83,74 @@ protected void setupConfig() {
7083

7184
@Test
7285
public void testPipeReceiverTypeConversionSemantics() {
73-
createTimeseries(senderEnv, true);
74-
createTimeseries(receiverEnv, false);
86+
createTimeseries(senderEnv, DEVICE, TypeConversionSemanticCase.CASES, true);
87+
createTimeseries(receiverEnv, DEVICE, TypeConversionSemanticCase.CASES, false);
7588
createPipe();
7689

77-
TestUtils.executeNonQueries(senderEnv, createInsertStatements(), null);
90+
TestUtils.executeNonQueries(
91+
senderEnv, createInsertStatements(DEVICE, TypeConversionSemanticCase.CASES, false), null);
7892

7993
TestUtils.assertDataEventuallyOnEnv(
8094
receiverEnv,
81-
createQuerySql(),
82-
createExpectedHeader(),
83-
new HashSet<>(createExpectedRows()),
95+
createQuerySql(DEVICE, TypeConversionSemanticCase.CASES),
96+
createExpectedHeader(DEVICE, TypeConversionSemanticCase.CASES),
97+
new HashSet<>(createExpectedRows(TypeConversionSemanticCase.CASES)),
8498
60);
8599
}
86100

87-
private static void createTimeseries(final BaseEnv env, final boolean useSourceType) {
101+
@Test
102+
public void testAlignedStreamPipeReceiverTypeConversionSemantics() {
103+
createAlignedTimeseries(senderEnv, ALIGNED_DEVICE, ALIGNED_STREAM_CASES, true);
104+
createAlignedTimeseries(receiverEnv, ALIGNED_DEVICE, ALIGNED_STREAM_CASES, false);
105+
createStreamPipe(ALIGNED_DEVICE);
106+
107+
TestUtils.executeNonQueries(
108+
senderEnv, createInsertStatements(ALIGNED_DEVICE, ALIGNED_STREAM_CASES, true), null);
109+
110+
TestUtils.assertDataEventuallyOnEnv(
111+
receiverEnv,
112+
createQuerySql(ALIGNED_DEVICE, ALIGNED_STREAM_CASES),
113+
createExpectedHeader(ALIGNED_DEVICE, ALIGNED_STREAM_CASES),
114+
new HashSet<>(createExpectedRows(ALIGNED_STREAM_CASES)),
115+
60);
116+
}
117+
118+
private static void createTimeseries(
119+
final BaseEnv env,
120+
final String device,
121+
final List<TypeConversionSemanticCase> conversionCases,
122+
final boolean useSourceType) {
88123
final List<String> sqls = new ArrayList<>();
89-
for (final TypeConversionSemanticCase conversionCase : TypeConversionSemanticCase.CASES) {
124+
for (final TypeConversionSemanticCase conversionCase : conversionCases) {
90125
sqls.add(
91126
String.format(
92127
"create timeseries %s.%s with datatype=%s,encoding=PLAIN",
93-
DEVICE,
128+
device,
94129
conversionCase.measurement,
95130
useSourceType ? conversionCase.sourceType : conversionCase.targetType));
96131
}
97132
TestUtils.executeNonQueries(env, sqls, null);
98133
}
99134

135+
private static void createAlignedTimeseries(
136+
final BaseEnv env,
137+
final String device,
138+
final List<TypeConversionSemanticCase> conversionCases,
139+
final boolean useSourceType) {
140+
final List<String> measurements = new ArrayList<>();
141+
for (final TypeConversionSemanticCase conversionCase : conversionCases) {
142+
measurements.add(
143+
String.format(
144+
"%s %s encoding=PLAIN",
145+
conversionCase.measurement,
146+
useSourceType ? conversionCase.sourceType : conversionCase.targetType));
147+
}
148+
TestUtils.executeNonQuery(
149+
env,
150+
String.format("create aligned timeseries %s(%s)", device, String.join(",", measurements)),
151+
null);
152+
}
153+
100154
private void createPipe() {
101155
TestUtils.executeNonQuery(
102156
senderEnv,
@@ -109,58 +163,97 @@ private void createPipe() {
109163
null);
110164
}
111165

112-
private static List<String> createInsertStatements() {
166+
private void createStreamPipe(final String device) {
167+
TestUtils.executeNonQuery(
168+
senderEnv,
169+
String.format(
170+
"create pipe aligned_type_conversion_semantic"
171+
+ " with source ('source'='iotdb-source','source.path'='%s.**','history.enable'='false','realtime.mode'='stream')"
172+
+ " with processor ('processor'='do-nothing-processor')"
173+
+ " with sink ('sink'='iotdb-thrift-sink','sink.node-urls'='%s')",
174+
device, receiverEnv.getDataNodeWrapperList().get(0).getIpAndPortString()),
175+
null);
176+
}
177+
178+
private static List<String> createInsertStatements(
179+
final String device,
180+
final List<TypeConversionSemanticCase> conversionCases,
181+
final boolean isAligned) {
113182
final List<String> sqls = new ArrayList<>();
114183
final String measurements =
115184
String.join(
116185
",",
117-
TypeConversionSemanticCase.CASES.stream()
186+
conversionCases.stream()
118187
.map(conversionCase -> conversionCase.measurement)
119188
.toArray(String[]::new));
120189
for (int row = 0; row < TypeConversionSemanticCase.ROW_COUNT; row++) {
121190
final List<String> values = new ArrayList<>();
122-
for (final TypeConversionSemanticCase conversionCase : TypeConversionSemanticCase.CASES) {
191+
for (final TypeConversionSemanticCase conversionCase : conversionCases) {
123192
values.add(conversionCase.sourceSqlValues[row]);
124193
}
125194
sqls.add(
126195
String.format(
127-
"insert into %s(time,%s) values (%d,%s)",
128-
DEVICE, measurements, row + 1, String.join(",", values)));
196+
"insert into %s(time,%s)%s values (%d,%s)",
197+
device,
198+
measurements,
199+
isAligned ? " aligned" : "",
200+
row + 1,
201+
String.join(",", values)));
129202
}
130203
sqls.add("flush");
131204
return sqls;
132205
}
133206

134-
private static String createQuerySql() {
207+
private static String createQuerySql(
208+
final String device, final List<TypeConversionSemanticCase> conversionCases) {
135209
return String.format(
136210
"select %s from %s",
137211
String.join(
138212
",",
139-
TypeConversionSemanticCase.CASES.stream()
213+
conversionCases.stream()
140214
.map(conversionCase -> conversionCase.measurement)
141215
.toArray(String[]::new)),
142-
DEVICE);
216+
device);
143217
}
144218

145-
private static String createExpectedHeader() {
219+
private static String createExpectedHeader(
220+
final String device, final List<TypeConversionSemanticCase> conversionCases) {
146221
final List<String> columns = new ArrayList<>();
147222
columns.add("Time");
148-
for (final TypeConversionSemanticCase conversionCase : TypeConversionSemanticCase.CASES) {
149-
columns.add(DEVICE + "." + conversionCase.measurement);
223+
for (final TypeConversionSemanticCase conversionCase : conversionCases) {
224+
columns.add(device + "." + conversionCase.measurement);
150225
}
151226
return String.join(",", columns) + ",";
152227
}
153228

154-
private static List<String> createExpectedRows() {
229+
private static List<String> createExpectedRows(
230+
final List<TypeConversionSemanticCase> conversionCases) {
155231
final List<String> rows = new ArrayList<>();
156232
for (int row = 0; row < TypeConversionSemanticCase.ROW_COUNT; row++) {
157233
final List<String> values = new ArrayList<>();
158234
values.add(Integer.toString(row + 1));
159-
for (final TypeConversionSemanticCase conversionCase : TypeConversionSemanticCase.CASES) {
235+
for (final TypeConversionSemanticCase conversionCase : conversionCases) {
160236
values.add(conversionCase.expectedValues[row]);
161237
}
162238
rows.add(String.join(",", values) + ",");
163239
}
164240
return rows;
165241
}
242+
243+
private static List<TypeConversionSemanticCase> getCases(final String... measurements) {
244+
final List<TypeConversionSemanticCase> cases = new ArrayList<>();
245+
for (final String measurement : measurements) {
246+
cases.add(getCase(measurement));
247+
}
248+
return cases;
249+
}
250+
251+
private static TypeConversionSemanticCase getCase(final String measurement) {
252+
for (final TypeConversionSemanticCase conversionCase : TypeConversionSemanticCase.CASES) {
253+
if (conversionCase.measurement.equals(measurement)) {
254+
return conversionCase;
255+
}
256+
}
257+
throw new IllegalArgumentException("Unknown type conversion semantic case: " + measurement);
258+
}
166259
}

0 commit comments

Comments
 (0)