blob: 902c4420d26128b86a3ac5555102579633580e92 [file]
using System;
using System.Collections.Generic;
using System.Linq;
using Thrift;
namespace Apache.IoTDB.DataStructure
{
public class RowRecord
{
public long Timestamps { get; }
public List<object> Values { get; }
public List<string> Measurements { get; }
public RowRecord(DateTime timestamp, List<object> values, List<string> measurements)
:this(new DateTimeOffset(timestamp.ToUniversalTime()).ToUnixTimeMilliseconds(), values,measurements)
{
}
public RowRecord(long timestamps, List<object> values, List<string> measurements)
{
Timestamps = timestamps;
Values = values;
Measurements = measurements;
}
public void Append(string measurement, object value)
{
Values.Add(value);
Measurements.Add(measurement);
}
public DateTime GetDateTime()
{
return DateTimeOffset.FromUnixTimeMilliseconds(Timestamps).DateTime.ToLocalTime();
}
public override string ToString()
{
var str = "TimeStamp";
foreach (var measurement in Measurements)
{
str += "\t\t";
str += measurement;
}
str += "\n";
str += Timestamps.ToString();
foreach (var rowValue in Values)
{
str += "\t\t";
str += rowValue.ToString();
}
return str;
}
public List<int> GetDataTypes()
{
var dataTypeValues = new List<int>();
foreach (var valueType in Values.Select(value => value))
{
switch (valueType)
{
case bool _:
dataTypeValues.Add((int) TSDataType.BOOLEAN);
break;
case int _:
dataTypeValues.Add((int) TSDataType.INT32);
break;
case long _:
dataTypeValues.Add((int) TSDataType.INT64);
break;
case float _:
dataTypeValues.Add((int) TSDataType.FLOAT);
break;
case double _:
dataTypeValues.Add((int) TSDataType.DOUBLE);
break;
case string _:
dataTypeValues.Add((int) TSDataType.TEXT);
break;
}
}
return dataTypeValues;
}
public TypeCode GetTypeCode(int index)
{
TypeCode tSDataType = TypeCode.Empty;
var valueType = Values[index];
switch (valueType)
{
case bool _:
tSDataType = TypeCode.Boolean;
break;
case int _:
tSDataType = TypeCode.Int32;
break;
case long _:
tSDataType = TypeCode.Int64;
break;
case float _:
tSDataType = TypeCode.Single;
break;
case double _:
tSDataType = TypeCode.Double;
break;
case string _:
tSDataType = TypeCode.String;
break;
}
return tSDataType;
}
public Type GetCrlType(int index)
{
Type tSDataType = typeof(object);
var valueType = Values[index];
switch (valueType)
{
case bool _:
tSDataType = typeof( bool);
break;
case int _:
tSDataType = typeof(int);
break;
case long _:
tSDataType = typeof(long);
break;
case float _:
tSDataType = typeof(float);
break;
case double _:
tSDataType = typeof(double);
break;
case string _:
tSDataType = typeof(string);
break;
}
return tSDataType;
}
public TSDataType GetDataType(int index)
{
TSDataType tSDataType = TSDataType.NONE;
var valueType = Values[index];
switch (valueType)
{
case bool _:
tSDataType = TSDataType.BOOLEAN;
break;
case int _:
tSDataType = TSDataType.INT32;
break;
case long _:
tSDataType = TSDataType.INT64;
break;
case float _:
tSDataType = TSDataType.FLOAT;
break;
case double _:
tSDataType = TSDataType.DOUBLE;
break;
case string _:
tSDataType = TSDataType.TEXT;
break;
}
return tSDataType;
}
public byte[] ToBytes()
{
var buffer = new ByteBuffer(Values.Count * 8);
foreach (var value in Values)
{
switch (value)
{
case bool b:
buffer.AddByte((byte) TSDataType.BOOLEAN);
buffer.AddBool(b);
break;
case int i:
buffer.AddByte((byte) TSDataType.INT32);
buffer.AddInt(i);
break;
case long l:
buffer.AddByte((byte) TSDataType.INT64);
buffer.AddLong(l);
break;
case double d:
buffer.AddByte((byte) TSDataType.DOUBLE);
buffer.AddDouble(d);
break;
case float f:
buffer.AddByte((byte) TSDataType.FLOAT);
buffer.AddFloat(f);
break;
case string s:
buffer.AddByte((byte) TSDataType.TEXT);
buffer.AddStr(s);
break;
default:
throw new TException($"Unsupported data type:{value.GetType()}", null);
}
}
return buffer.GetBuffer();;
}
}
}