You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/12/28 06:24:11 UTC

[iotdb] branch rel/1.0 updated: [To rel/1.0][IOTDB-5278] fix connection problem of dbeaver and supports more functions (#8631)

This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch rel/1.0
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.0 by this push:
     new 74dd0251bd [To rel/1.0][IOTDB-5278] fix connection problem of dbeaver and supports more functions (#8631)
74dd0251bd is described below

commit 74dd0251bda3d394aa2a6021b6e7baffc3572ffa
Author: YangCaiyin <yc...@gmail.com>
AuthorDate: Wed Dec 28 14:24:05 2022 +0800

    [To rel/1.0][IOTDB-5278] fix connection problem of dbeaver and supports more functions (#8631)
---
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   | 208 ++++-----------------
 1 file changed, 32 insertions(+), 176 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
index 505b6cb4d6..5d1b56f211 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
@@ -23,22 +23,16 @@ import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.IClientRPCService;
 import org.apache.iotdb.service.rpc.thrift.TSFetchMetadataReq;
 import org.apache.iotdb.service.rpc.thrift.TSFetchMetadataResp;
-import org.apache.iotdb.service.rpc.thrift.TSQueryDataSet;
-import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.read.common.block.column.TsBlockSerde;
-import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.sql.Connection;
@@ -53,7 +47,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
@@ -714,127 +707,11 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
         false);
   }
 
-  public static TSQueryDataSet convertQueryDataSetByFetchSize(
-      QueryDataSet queryDataSet, int fetchSize, WatermarkEncoder watermarkEncoder)
-      throws IOException {
-    int columnNum = queryDataSet.getColumnNum();
-    TSQueryDataSet tsQueryDataSet = new TSQueryDataSet();
-    // one time column and each value column has a actual value buffer and a bitmap value to
-    // indicate whether it is a null
-    int columnNumWithTime = columnNum * 2 + 1;
-    DataOutputStream[] dataOutputStreams = new DataOutputStream[columnNumWithTime];
-    ByteArrayOutputStream[] byteArrayOutputStreams = new ByteArrayOutputStream[columnNumWithTime];
-    for (int i = 0; i < columnNumWithTime; i++) {
-      byteArrayOutputStreams[i] = new ByteArrayOutputStream();
-      dataOutputStreams[i] = new DataOutputStream(byteArrayOutputStreams[i]);
-    }
-    int rowCount = 0;
-    int[] valueOccupation = new int[columnNum];
-    // used to record a bitmap for every 8 row record
-    int[] bitmap = new int[columnNum];
-    for (int i = 0; i < fetchSize; i++) {
-      if (queryDataSet.hasNext()) {
-        RowRecord rowRecord = queryDataSet.next();
-        if (watermarkEncoder != null) {
-          rowRecord = watermarkEncoder.encodeRecord(rowRecord);
-        }
-        // use columnOutput to write byte array
-        dataOutputStreams[0].writeLong(rowRecord.getTimestamp());
-        List<org.apache.iotdb.tsfile.read.common.Field> fields = rowRecord.getFields();
-        for (int k = 0; k < fields.size(); k++) {
-          org.apache.iotdb.tsfile.read.common.Field field = fields.get(k);
-          DataOutputStream dataOutputStream = dataOutputStreams[2 * k + 1]; // DO NOT FORGET +1
-          if (field == null || field.getDataType() == null) {
-            bitmap[k] = (bitmap[k] << 1);
-          } else {
-            bitmap[k] = (bitmap[k] << 1) | 0x01;
-            TSDataType type = field.getDataType();
-            switch (type) {
-              case INT32:
-                dataOutputStream.writeInt(field.getIntV());
-                valueOccupation[k] += 4;
-                break;
-              case INT64:
-                dataOutputStream.writeLong(field.getLongV());
-                valueOccupation[k] += 8;
-                break;
-              case FLOAT:
-                dataOutputStream.writeFloat(field.getFloatV());
-                valueOccupation[k] += 4;
-                break;
-              case DOUBLE:
-                dataOutputStream.writeDouble(field.getDoubleV());
-                valueOccupation[k] += 8;
-                break;
-              case BOOLEAN:
-                dataOutputStream.writeBoolean(field.getBoolV());
-                valueOccupation[k] += 1;
-                break;
-              case TEXT:
-                dataOutputStream.writeInt(field.getBinaryV().getLength());
-                dataOutputStream.write(field.getBinaryV().getValues());
-                valueOccupation[k] = valueOccupation[k] + 4 + field.getBinaryV().getLength();
-                break;
-              default:
-                throw new UnSupportedDataTypeException(
-                    String.format("Data type %s is not supported.", type));
-            }
-          }
-        }
-        rowCount++;
-        if (rowCount % 8 == 0) {
-          for (int j = 0; j < bitmap.length; j++) {
-            DataOutputStream dataBitmapOutputStream = dataOutputStreams[2 * (j + 1)];
-            dataBitmapOutputStream.writeByte(bitmap[j]);
-            // we should clear the bitmap every 8 row record
-            bitmap[j] = 0;
-          }
-        }
-      } else {
-        break;
-      }
-    }
-
-    // feed the remaining bitmap
-    int remaining = rowCount % 8;
-    if (remaining != 0) {
-      for (int j = 0; j < bitmap.length; j++) {
-        DataOutputStream dataBitmapOutputStream = dataOutputStreams[2 * (j + 1)];
-        dataBitmapOutputStream.writeByte(bitmap[j] << (8 - remaining));
-      }
-    }
-    // calculate the time buffer size
-    int timeOccupation = rowCount * 8;
-    ByteBuffer timeBuffer = ByteBuffer.allocate(timeOccupation);
-    timeBuffer.put(byteArrayOutputStreams[0].toByteArray());
-    timeBuffer.flip();
-    tsQueryDataSet.setTime(timeBuffer);
-
-    // calculate the bitmap buffer size
-    int bitmapOccupation = rowCount / 8 + (rowCount % 8 == 0 ? 0 : 1);
-
-    List<ByteBuffer> bitmapList = new LinkedList<>();
-    List<ByteBuffer> valueList = new LinkedList<>();
-    for (int i = 1; i < byteArrayOutputStreams.length; i += 2) {
-      ByteBuffer valueBuffer = ByteBuffer.allocate(valueOccupation[(i - 1) / 2]);
-      valueBuffer.put(byteArrayOutputStreams[i].toByteArray());
-      valueBuffer.flip();
-      valueList.add(valueBuffer);
-
-      ByteBuffer bitmapBuffer = ByteBuffer.allocate(bitmapOccupation);
-      bitmapBuffer.put(byteArrayOutputStreams[i + 1].toByteArray());
-      bitmapBuffer.flip();
-      bitmapList.add(bitmapBuffer);
-    }
-    tsQueryDataSet.setBitmapList(bitmapList);
-    tsQueryDataSet.setValueList(valueList);
-    return tsQueryDataSet;
-  }
-
   public static ByteBuffer convertTsBlock(
       List<List<Object>> valuesList, List<TSDataType> tsDataTypeList) throws IOException {
     TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(tsDataTypeList);
     for (List<Object> valuesInRow : valuesList) {
+      tsBlockBuilder.getTimeColumnBuilder().writeLong(0);
       for (int j = 0; j < tsDataTypeList.size(); j++) {
         TSDataType columnType = tsDataTypeList.get(j);
         switch (columnType) {
@@ -870,48 +747,6 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
     }
   }
 
-  private void addToDataSet(List<List<Map>> listbigPaths, ListDataSet dataSet) {
-    List<TSDataType> listType = new ArrayList<>();
-    int i = 0;
-    for (List<Map> listPaths : listbigPaths) {
-      RowRecord record = new RowRecord(0);
-      for (Map<String, Object> map : listPaths) {
-        TSDataType columnType = (TSDataType) map.get("type");
-        Object val = map.get("val");
-        org.apache.iotdb.tsfile.read.common.Field field =
-            new org.apache.iotdb.tsfile.read.common.Field(columnType);
-        switch (columnType) {
-          case TEXT:
-            field.setBinaryV(new Binary(val.toString()));
-            break;
-          case FLOAT:
-            field.setFloatV(((float) val));
-            break;
-          case INT32:
-            field.setIntV(((int) val));
-            break;
-          case INT64:
-            field.setLongV(((long) val));
-            break;
-          case DOUBLE:
-            field.setDoubleV(((double) val));
-            break;
-          case BOOLEAN:
-            field.setBoolV(((boolean) val));
-            break;
-        }
-        record.addField(field);
-        if (i == 0) {
-          listType.add(columnType);
-        }
-      }
-      i++;
-      dataSet.putRecord(record);
-    }
-    dataSet.setDataTypes(listType);
-    dataSet.setColumnNum(listType.size());
-  }
-
   @Override
   public ResultSet getClientInfoProperties() throws SQLException {
     Statement stmt = this.connection.createStatement();
@@ -1674,6 +1509,11 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
             TSDataType.TEXT,
             TSDataType.INT32,
             TSDataType.TEXT);
+
+    String database = "";
+    if (catalog != null) database = catalog;
+    else if (schema != null) database = schema;
+
     Field[] fields = new Field[6];
     fields[0] = new Field("", "TABLE_CAT", "TEXT");
     fields[1] = new Field("", "TABLE_SCHEM", "TEXT");
@@ -1682,8 +1522,8 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
     fields[4] = new Field("", "KEY_SEQ", "INT32");
     fields[5] = new Field("", "PK_NAME", "TEXT");
 
-    List<Object> listValSub_1 = Arrays.asList(catalog, "", table, "time", 1, "PRIMARY");
-    List<Object> listValSub_2 = Arrays.asList(catalog, "", table, "deivce", 2, "PRIMARY");
+    List<Object> listValSub_1 = Arrays.asList(database, "", table, "time", 1, "PRIMARY");
+    List<Object> listValSub_2 = Arrays.asList(database, "", table, "deivce", 2, "PRIMARY");
     List<List<Object>> valuesList = Arrays.asList(listValSub_1, listValSub_2);
     for (int i = 0; i < fields.length; i++) {
       columnNameList.add(fields[i].getName());
@@ -2227,7 +2067,7 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
       throws SQLException {
     Statement stmt = this.connection.createStatement();
 
-    String sql = "SHOW DATABASES";
+    String sql = "SHOW TIMESERIES";
     if (catalog != null && catalog.length() > 0) {
       if (catalog.contains("%")) {
         catalog = catalog.replace("%", "*");
@@ -2255,6 +2095,9 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
         && tableNamePattern.length() > 0
         && columnNamePattern != null
         && columnNamePattern.length() > 0) {
+      if (columnNamePattern.contains("%")) {
+        columnNamePattern = columnNamePattern.replace("%", "*");
+      }
       sql = sql + "." + columnNamePattern;
     }
     ResultSet rs = stmt.executeQuery(sql);
@@ -2321,11 +2164,19 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
     }
     while (rs.next()) {
       List<Object> valuesInRow = new ArrayList<>();
+      String res = rs.getString(1);
+      String[] splitRes = res.split("\\.");
       for (int i = 0; i < fields.length; i++) {
-        if (i < 4) {
-          valuesInRow.add(1);
+        if (i <= 1) {
+          valuesInRow.add(" ");
+        } else if (i == 2) {
+          valuesInRow.add(
+              res.substring(0, res.length() - splitRes[splitRes.length - 1].length() - 1));
+        } else if (i == 3) {
+          // column name
+          valuesInRow.add(splitRes[splitRes.length - 1]);
         } else if (i == 4) {
-          valuesInRow.add(getSQLType(fields[i].getSqlType()));
+          valuesInRow.add(getSQLType(rs.getString(4)));
         } else if (i == 6) {
           valuesInRow.add(getTypePrecision(fields[i].getSqlType()));
         } else if (i == 7) {
@@ -2475,16 +2326,19 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
       throws SQLException {
     Statement stmt = this.connection.createStatement();
 
-    String sql = "SHOW timeseries";
+    String sql = "SHOW devices";
+    String database = "";
     if (catalog != null && catalog.length() > 0) {
       if (catalog.contains("%")) {
         catalog = catalog.replace("%", "*");
       }
+      database = catalog;
       sql = sql + " " + catalog;
     } else if (schemaPattern != null && schemaPattern.length() > 0) {
       if (schemaPattern.contains("%")) {
         schemaPattern = schemaPattern.replace("%", "*");
       }
+      database = schemaPattern;
       sql = sql + " " + schemaPattern;
     }
     if (((catalog != null && catalog.length() > 0)
@@ -2492,7 +2346,7 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
         && tableNamePattern != null
         && tableNamePattern.length() > 0) {
       if (tableNamePattern.contains("%")) {
-        tableNamePattern = tableNamePattern.replace("%", "*");
+        tableNamePattern = tableNamePattern.replace("%", "**");
       }
       sql = sql + "." + tableNamePattern;
     }
@@ -2534,11 +2388,13 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
     }
     while (rs.next()) {
       List<Object> valueInRow = new ArrayList<>();
+      String res = rs.getString(1);
+
       for (int i = 0; i < fields.length; i++) {
         if (i < 2) {
-          valueInRow.add(rs.getString(3));
+          valueInRow.add("");
         } else if (i == 2) {
-          valueInRow.add(rs.getString(1));
+          valueInRow.add(res.substring(database.length() + 1));
         } else if (i == 3) {
           valueInRow.add("TABLE");
         } else {