lausannel commented on code in PR #37:
URL: 
https://github.com/apache/iotdb-client-csharp/pull/37#discussion_r2296753750


##########
src/Apache.IoTDB/DataStructure/SessionDataSet.cs:
##########
@@ -32,284 +32,104 @@ public class SessionDataSet : System.IDisposable
         private readonly string _sql;
         private readonly List<string> _columnNames;
         private readonly Dictionary<string, int> _columnNameIndexMap;
-        private readonly Dictionary<int, int> _duplicateLocation;
         private readonly List<string> _columnTypeLst;
-        private TSQueryDataSet _queryDataset;
-        private readonly byte[] _currentBitmap;
         private readonly int _columnSize;
         private List<ByteBuffer> _valueBufferLst, _bitmapBufferLst;
-        private ByteBuffer _timeBuffer;
-        private readonly ConcurrentClientQueue _clientQueue;
         private Client _client;
         private int _rowIndex;
-        private bool _hasCatchedResult;
         private RowRecord _cachedRowRecord;
         private bool _isClosed = false;
         private bool disposedValue;
+        private RpcDataSet _rpcDataSet;
+        private string _zoneId;
+        private readonly ConcurrentClientQueue _clientQueue;
 
         private string TimestampStr => "Time";
         private int StartIndex => 2;
         private int Flag => 0x80;
         private int DefaultTimeout => 10000;
         public int FetchSize { get; set; }
-        public int RowCount { get; set; }
-        public SessionDataSet(string sql, TSExecuteStatementResp resp, Client 
client, ConcurrentClientQueue clientQueue, long statementId)
+        public SessionDataSet(
+            string sql, List<string> ColumnNameList, List<string> 
ColumnTypeList,
+            Dictionary<string, int> ColumnNameIndexMap, long QueryId, long 
statementId, Client client, List<byte[]> QueryResult,
+            bool IgnoreTimeStamp, bool MoreData, string zoneId, List<int> 
ColumnIndex2TsBlockColumnIndexList, ConcurrentClientQueue _clientQueueS
+        )
         {
-            _clientQueue = clientQueue;
             _client = client;
             _sql = sql;
-            _queryDataset = resp.QueryDataSet;
-            _queryId = resp.QueryId;
+            _queryId = QueryId;
             _statementId = statementId;
-            _columnSize = resp.Columns.Count;
-            _currentBitmap = new byte[_columnSize];
-            _columnNames = new List<string>();
-            _timeBuffer = new ByteBuffer(_queryDataset.Time);
-            // column name -> column location
-            _columnNameIndexMap = new Dictionary<string, int>();
-            _columnTypeLst = new List<string>();
-            _duplicateLocation = new Dictionary<int, int>();
-            _valueBufferLst = new List<ByteBuffer>();
-            _bitmapBufferLst = new List<ByteBuffer>();
-            // some internal variable
-            _hasCatchedResult = false;
+            _columnSize = ColumnNameList.Count;
+            _columnNameIndexMap = ColumnNameIndexMap;
             _rowIndex = 0;
-            RowCount = _queryDataset.Time.Length / sizeof(long);
-
-            _columnNames = resp.Columns;
-            _columnTypeLst = resp.DataTypeList;
-
-            int deduplicateIdx = 0;
-            Dictionary<string, int> columnToFirstIndexMap = new 
Dictionary<string, int>();
-            for (var i = 0; i < _columnSize; i++)
-            {
-                var columnName = _columnNames[i];
-                if (_columnNameIndexMap.ContainsKey(columnName))
-                {
-                    _duplicateLocation[i] = columnToFirstIndexMap[columnName];
-                }
-                else
-                {
-                    columnToFirstIndexMap[columnName] = i;
-                    if (resp.ColumnNameIndexMap != null)
-                    {
-                        int valueIndex = resp.ColumnNameIndexMap[columnName];
-                        _columnNameIndexMap[columnName] = valueIndex;
-                        _valueBufferLst.Add(new 
ByteBuffer(_queryDataset.ValueList[valueIndex]));
-                        _bitmapBufferLst.Add(new 
ByteBuffer(_queryDataset.BitmapList[valueIndex]));
-                    }
-                    else
-                    {
-                        _columnNameIndexMap[columnName] = deduplicateIdx;
-                        _valueBufferLst.Add(new 
ByteBuffer(_queryDataset.ValueList[deduplicateIdx]));
-                        _bitmapBufferLst.Add(new 
ByteBuffer(_queryDataset.BitmapList[deduplicateIdx]));
-                    }
-                    deduplicateIdx++;
-                }
-            }
-        }
-        public List<string> ColumnNames => _columnNames;
-
-
-        private List<string> GetColumnNames()
-        {
-            var lst = new List<string>
-            {
-                "timestamp"
-            };
-            lst.AddRange(_columnNames);
-            return lst;
-        }
 
-        public void ShowTableNames()
-        {
-            var str = GetColumnNames()
-                .Aggregate("", (current, name) => current + (name + "\t\t"));
+            _columnNames = ColumnNameList;
+            _columnTypeLst = ColumnTypeList;
+            _zoneId = zoneId;
+            _clientQueue = _clientQueueS;
 
-            Console.WriteLine(str);
+            _rpcDataSet = new RpcDataSet(
+                _sql, _columnNames, _columnTypeLst, _columnNameIndexMap, 
IgnoreTimeStamp,
+                MoreData, _queryId, _statementId, _client, _client.SessionId, 
QueryResult, FetchSize,
+                DefaultTimeout, _zoneId, ColumnIndex2TsBlockColumnIndexList
+            );
         }
-
         public bool HasNext()
         {
-            if (_hasCatchedResult)
-            {
-                return true;
-            }
-
-            // we have consumed all current data, fetch some more
-            if (!_timeBuffer.HasRemaining())
-            {
-                if (!FetchResults())
-                {
-                    return false;
-                }
-            }
-
-            ConstructOneRow();
-            _hasCatchedResult = true;
-            return true;
+            if (_rpcDataSet.HasCachedRecord) return true;
+            return Next();
         }
 
-        public RowRecord Next()
-        {
-            if (!_hasCatchedResult)
-            {
-                if (!HasNext())
-                {
-                    return null;
-                }
-            }
+        public bool Next() => _rpcDataSet.Next();
+        public bool IsNull(string columnName) => 
_rpcDataSet.IsNullByColumnName(columnName);
+        public bool IsNullByIndex(int columnIndex) => 
_rpcDataSet.IsNullByIndex(columnIndex);
 
-            _hasCatchedResult = false;
-            return _cachedRowRecord;
-        }
-        public RowRecord GetRow()
-        {
-            return _cachedRowRecord;
-        }
+        public bool GetBooleanByIndex(int columnIndex) => 
_rpcDataSet.GetBooleanByIndex(columnIndex);
+        public bool GetBoolean(string columnName) => 
_rpcDataSet.GetBoolean(columnName);
 
-        private TSDataType GetDataTypeFromStr(string str)
-        {
-            return str switch
-            {
-                "BOOLEAN" => TSDataType.BOOLEAN,
-                "INT32" => TSDataType.INT32,
-                "INT64" => TSDataType.INT64,
-                "FLOAT" => TSDataType.FLOAT,
-                "DOUBLE" => TSDataType.DOUBLE,
-                "TEXT" => TSDataType.TEXT,
-                "NULLTYPE" => TSDataType.NONE,
-                "TIMESTAMP" => TSDataType.TIMESTAMP,
-                "DATE" => TSDataType.DATE,
-                "BLOB" => TSDataType.BLOB,
-                "STRING" => TSDataType.STRING,
-                _ => TSDataType.STRING
-            };
-        }
+        public double GetDoubleByIndex(int columnIndex) => 
_rpcDataSet.GetDoubleByIndex(columnIndex);
+        public double GetDouble(string columnName) => 
_rpcDataSet.GetDouble(columnName);
 
-        private void ConstructOneRow()
-        {
-            List<object> fieldList = new List<Object>();
+        public float GetFloatByIndex(int columnIndex) => 
_rpcDataSet.GetFloatByIndex(columnIndex);
+        public float GetFloat(string columnName) => 
_rpcDataSet.GetFloat(columnName);
 
-            for (int i = 0; i < _columnSize; i++)
-            {
-                if (_duplicateLocation.ContainsKey(i))
-                {
-                    var field = fieldList[_duplicateLocation[i]];
-                    fieldList.Add(field);
-                }
-                else
-                {
-                    var columnValueBuffer = _valueBufferLst[i];
-                    var columnBitmapBuffer = _bitmapBufferLst[i];
+        public int GetIntByIndex(int columnIndex) => 
_rpcDataSet.GetIntByIndex(columnIndex);
+        public int GetInt(string columnName) => _rpcDataSet.GetInt(columnName);
 
-                    if (_rowIndex % 8 == 0)
-                    {
-                        _currentBitmap[i] = columnBitmapBuffer.GetByte();
-                    }
+        public long GetLongByIndex(int columnIndex) => 
_rpcDataSet.GetLongByIndex(columnIndex);
+        public long GetLong(string columnName) => 
_rpcDataSet.GetLong(columnName);
 
-                    object localField;
-                    if (!IsNull(i, _rowIndex))
-                    {
-                        var columnDataType = 
GetDataTypeFromStr(_columnTypeLst[i]);
+        public object GetObjectByIndex(int columnIndex) => 
_rpcDataSet.GetObjectByIndex(columnIndex);
+        public object GetObject(string columnName) => 
_rpcDataSet.GetObject(columnName);
 
+        public string GetStringByIndex(int columnIndex) => 
_rpcDataSet.GetStringByIndex(columnIndex);
+        public string GetString(string columnName) => 
_rpcDataSet.GetString(columnName);
 
-                        switch (columnDataType)
-                        {
-                            case TSDataType.BOOLEAN:
-                                localField = columnValueBuffer.GetBool();
-                                break;
-                            case TSDataType.INT32:
-                                // case TSDataType.DATE:
-                                localField = columnValueBuffer.GetInt();
-                                break;
-                            case TSDataType.DATE:
-                                localField = 
Utils.ParseIntToDate(columnValueBuffer.GetInt());
-                                break;
-                            case TSDataType.INT64:
-                            case TSDataType.TIMESTAMP:
-                                localField = columnValueBuffer.GetLong();
-                                break;
-                            case TSDataType.FLOAT:
-                                localField = columnValueBuffer.GetFloat();
-                                break;
-                            case TSDataType.DOUBLE:
-                                localField = columnValueBuffer.GetDouble();
-                                break;
-                            case TSDataType.TEXT:
-                            case TSDataType.STRING:
-                                // case TSDataType.BLOB:
-                                localField = columnValueBuffer.GetStr();
-                                break;
-                            case TSDataType.BLOB:
-                                localField = columnValueBuffer.GetBinary();
-                                break;
-                            // TODO
-                            default:
-                                string err_msg = "value format not supported";
-                                throw new TException(err_msg, null);
-                        }
+        public DateTime GetTimestampByIndex(int columnIndex) => 
_rpcDataSet.GetTimestampByIndex(columnIndex);
+        public DateTime GetTimestamp(string columnName) => 
_rpcDataSet.GetTimestamp(columnName);
 
-                        fieldList.Add(localField);
-                    }
-                    else
-                    {
-                        localField = null;
-                        fieldList.Add(DBNull.Value);
-                    }
-                }
-            }
+        public DateTime GetDateByIndex(int columnIndex) => 
_rpcDataSet.GetDateByIndex(columnIndex);
+        public DateTime GetDate(string columnName) => 
_rpcDataSet.GetDate(columnName);
 
-            long timestamp = _timeBuffer.GetLong();
-            _rowIndex += 1;
-            _cachedRowRecord = new RowRecord(timestamp, fieldList, 
_columnNames);
-        }
+        public Binary GetBlobByIndex(int columnIndex) => 
_rpcDataSet.GetBinaryByIndex(columnIndex);
+        public Binary GetBlob(string columnName) => 
_rpcDataSet.GetBinary(columnName);
 
-        private bool IsNull(int loc, int row_index)
-        {
-            byte bitmap = _currentBitmap[loc];
-            int shift = row_index % 8;
-            return ((Flag >> shift) & bitmap) == 0;
-        }
+        public int FindColumn(string columnName) => 
_rpcDataSet.FindColumn(columnName);
 
-        private bool FetchResults()
-        {
-            _rowIndex = 0;
-            var req = new TSFetchResultsReq(_client.SessionId, _sql, 
FetchSize, _queryId, true)
-            {
-                Timeout = DefaultTimeout
-            };
-            try
-            {
-                var task = _client.ServiceClient.fetchResultsAsync(req);
+        public IReadOnlyList<string> GetColumnNames() => 
_rpcDataSet._columnNameList;
+        public IReadOnlyList<string> GetColumnTypes() => 
_rpcDataSet._columnTypeList;
 
-                var resp = task.ConfigureAwait(false).GetAwaiter().GetResult();
+        public RowRecord GetRow() => _rpcDataSet.GetRow();

Review Comment:
   Resolved. All interfaces remain unchanged from the previous version



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to