4141public 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