From 9f12b58c0ba3a34541cb496371dea28915c52d71 Mon Sep 17 00:00:00 2001 From: Xuan Ronaldo Date: Fri, 25 Nov 2022 17:29:30 +0800 Subject: [PATCH] [IOTDB-5028] Using `show timeseries` to query the schema in import-csv (#8130) --- .../java/org/apache/iotdb/tool/ImportCsv.java | 65 ++++++++++++------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java b/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java index 51ece1e394..71b14915a6 100644 --- a/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java +++ b/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java @@ -21,6 +21,7 @@ package org.apache.iotdb.tool; import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.utils.PathUtils; +import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant; import org.apache.iotdb.db.qp.constant.SQLConstant; import org.apache.iotdb.db.qp.utils.DateTimeUtils; import org.apache.iotdb.exception.ArgsErrorException; @@ -30,6 +31,8 @@ import org.apache.iotdb.session.Session; import org.apache.iotdb.session.SessionDataSet; import org.apache.iotdb.tsfile.common.constant.TsFileConstant; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; +import org.apache.iotdb.tsfile.read.common.Field; +import org.apache.iotdb.tsfile.read.common.RowRecord; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -436,10 +439,9 @@ public class ImportCsv extends AbstractCsvTool { parseHeaders(headerNames, deviceAndMeasurementNames, headerTypeMap, headerNameMap); Set devices = deviceAndMeasurementNames.keySet(); - String devicesStr = StringUtils.join(devices, ","); if (headerTypeMap.isEmpty()) { try { - queryType(devicesStr, headerTypeMap, "Time"); + queryType(devices, headerTypeMap, "Time"); } catch (IoTDBConnectionException e) { e.printStackTrace(); } @@ -601,7 +603,15 @@ public class ImportCsv extends AbstractCsvTool { if (!typeQueriedDevice.contains(deviceName.get())) { try { if (headerTypeMap.isEmpty()) { - hasResult = queryType(deviceName.get(), headerTypeMap, "Device"); + hasResult = + queryType( + new HashSet() { + { + add(deviceName.get()); + } + }, + headerTypeMap, + "Device"); } typeQueriedDevice.add(deviceName.get()); } catch (IoTDBConnectionException e) { @@ -817,32 +827,37 @@ public class ImportCsv extends AbstractCsvTool { * @throws StatementExecutionException */ private static boolean queryType( - String deviceNames, HashMap headerTypeMap, String alignedType) + Set deviceNames, HashMap headerTypeMap, String alignedType) throws IoTDBConnectionException { - String sql = "select * from " + deviceNames + " limit 1"; - SessionDataSet sessionDataSet = null; - try { - sessionDataSet = session.executeQueryStatement(sql); - } catch (StatementExecutionException e) { - System.out.println("Meet error when query the type of timeseries because " + e.getMessage()); - return false; - } - List columnNames = sessionDataSet.getColumnNames(); - List columnTypes = sessionDataSet.getColumnTypes(); - if (columnNames.size() == 1) { - return false; - } else { - for (int i = 1; i < columnNames.size(); i++) { - if (Objects.equals(alignedType, "Time")) { - headerTypeMap.put(columnNames.get(i), getType(columnTypes.get(i))); - } else if (Objects.equals(alignedType, "Device")) { - String[] split = columnNames.get(i).split("\\."); - String measurement = split[split.length - 1]; - headerTypeMap.put(measurement, getType(columnTypes.get(i))); + boolean hasResult = false; + for (String deviceName : deviceNames) { + String sql = "show timeseries " + deviceName + ".*"; + SessionDataSet sessionDataSet = null; + try { + sessionDataSet = session.executeQueryStatement(sql); + int tsIndex = sessionDataSet.getColumnNames().indexOf(ColumnHeaderConstant.TIMESERIES); + int dtIndex = sessionDataSet.getColumnNames().indexOf(ColumnHeaderConstant.DATATYPE); + while (sessionDataSet.hasNext()) { + hasResult = true; + RowRecord record = sessionDataSet.next(); + List fields = record.getFields(); + String timeseries = fields.get(tsIndex).getStringValue(); + String dataType = fields.get(dtIndex).getStringValue(); + if (Objects.equals(alignedType, "Time")) { + headerTypeMap.put(timeseries, getType(dataType)); + } else if (Objects.equals(alignedType, "Device")) { + String[] split = PathUtils.splitPathToDetachedNodes(timeseries); + String measurement = split[split.length - 1]; + headerTypeMap.put(measurement, getType(dataType)); + } } + } catch (StatementExecutionException | IllegalPathException e) { + System.out.println( + "Meet error when query the type of timeseries because " + e.getMessage()); + return false; } - return true; } + return hasResult; } /** -- GitLab