CritasWang commented on code in PR #37:
URL:
https://github.com/apache/iotdb-client-csharp/pull/37#discussion_r2174177357
##########
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:
Let's keep the user's performance unchanged
`HasNext`
`Next`
This can be used as a new method, but the semantics of the old method should
not be changed
`public RowRecord GetRow() => _rpcDataSet.GetRow();`
--
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]