diff --git a/src/JiShe.CollectBus.IoTDBProvider/Provider/DeviceMetadata.cs b/src/JiShe.CollectBus.IoTDBProvider/Provider/DeviceMetadata.cs index 50aa8f7..6bdbd56 100644 --- a/src/JiShe.CollectBus.IoTDBProvider/Provider/DeviceMetadata.cs +++ b/src/JiShe.CollectBus.IoTDBProvider/Provider/DeviceMetadata.cs @@ -20,7 +20,7 @@ namespace JiShe.CollectBus.IoTDBProvider /// /// 测量值集合,用于构建Table的测量值,也就是columnNames参数 /// - public List ColumnNames { get; } = new(); + public List ColumnNames { get; set; } = new(); /// /// 列类型集合,用于构建Table的列类型,也就是columnCategories参数 @@ -30,6 +30,6 @@ namespace JiShe.CollectBus.IoTDBProvider /// /// 值类型集合,用于构建Table的值类型,也就是dataTypes参数 /// - public ListDataTypes { get; } = new(); + public List DataTypes { get; } = new(); } } diff --git a/src/JiShe.CollectBus.IoTDBProvider/Provider/IoTDBProvider.cs b/src/JiShe.CollectBus.IoTDBProvider/Provider/IoTDBProvider.cs index acfab09..705b2c1 100644 --- a/src/JiShe.CollectBus.IoTDBProvider/Provider/IoTDBProvider.cs +++ b/src/JiShe.CollectBus.IoTDBProvider/Provider/IoTDBProvider.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; +using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; @@ -42,7 +43,7 @@ namespace JiShe.CollectBus.IoTDBProvider _runtimeContext = runtimeContext; } - + /// /// 插入数据 /// @@ -143,29 +144,39 @@ namespace JiShe.CollectBus.IoTDBProvider var timestamps = new List(); var values = new List>(); var devicePaths = new HashSet(); + List tempColumnNames = new List(); + tempColumnNames.AddRange(metadata.ColumnNames); foreach (var entity in entities) { timestamps.Add(entity.Timestamps); var rowValues = new List(); - foreach (var measurement in metadata.ColumnNames) + foreach (var measurement in tempColumnNames) { PropertyInfo propertyInfo = typeof(T).GetProperty(measurement); if (propertyInfo == null) { - throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,没有找到{measurement}属性,属于异常情况。"); + throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,没有找到{measurement}属性,属于异常情况,-101。"); } var value = propertyInfo.GetValue(entity); - if (propertyInfo.IsDefined(typeof(SingleMeasuringAttribute), false) && value != null)//表示当前对象是单测点模式, + if (propertyInfo.IsDefined(typeof(SingleMeasuringAttribute), false) && value != null)//表示当前对象是单测点模式 { Type tupleType = value.GetType(); Type[] tupleArgs = tupleType.GetGenericArguments(); Type item2Type = tupleArgs[1]; // T 的实际类型 - var item2 = tupleType.GetProperty("Item2")!.GetValue(value); + var item1 = tupleType.GetProperty("Item1")!.GetValue(value); + var item2 = tupleType.GetProperty("Item2")!.GetValue(value); + if (item1 == null || item2 == null) + { + throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,单测点模式构建失败,没有获取测点名称或者测点值,-102。"); + } - rowValues.Add(item2); + var indexOf = metadata.ColumnNames.IndexOf(measurement); + metadata.ColumnNames[indexOf] = (string)item1!; + + rowValues.Add(item2); } else @@ -389,12 +400,34 @@ namespace JiShe.CollectBus.IoTDBProvider /// private DeviceMetadata GetMetadata() where T : IoTEntity { - return _metadataCache.GetOrAdd(typeof(T), type => - { - var columns = CollectColumnMetadata(type); - var metadata = BuildDeviceMetadata(columns); - return metadata; - }); + + var columns = CollectColumnMetadata(typeof(T)); + var metadata = BuildDeviceMetadata(columns); + + return _metadataCache.AddOrUpdate( + typeof(T), + addValueFactory: t => metadata, // 如果键不存在,用此值添加 + updateValueFactory: (t, existingValue) => + { + var columns = CollectColumnMetadata(t); + var metadata = BuildDeviceMetadata(columns); + + //对现有值 existingValue 进行修改,返回新值 + existingValue.ColumnNames = metadata.ColumnNames; + return existingValue; + } + ); + + //return _metadataCache.GetOrAdd(typeof(T), type => + //{ + // var columns = CollectColumnMetadata(type); + // var metadata = BuildDeviceMetadata(columns); + // //if (metadata.IsSingleMeasuring) + // //{ + // // _metadataCache.Remove(typeof(T)); + // //} + // return metadata; + //}); } /// @@ -434,7 +467,7 @@ namespace JiShe.CollectBus.IoTDBProvider //warning: 单侧点模式注意事项 //Entity实体 字段类型是 Tuple,Item1=>测点名称,Item2=>测点值,泛型 //只有一个Filed字段。 - //MeasuringName 默认为 SingleMeasuringAttribute.FieldName。 + //MeasuringName 默认为 SingleMeasuringAttribute.FieldName,以便于在获取对应的Value的时候重置为 Item1 的值。 Type tupleType = prop.PropertyType; Type[] tupleArgs = tupleType.GetGenericArguments(); @@ -446,7 +479,7 @@ namespace JiShe.CollectBus.IoTDBProvider true ); } - + if (column.HasValue) { columns.Add(column.Value); diff --git a/src/JiShe.CollectBus.IoTDBProvider/Provider/SessionPoolAdapter.cs b/src/JiShe.CollectBus.IoTDBProvider/Provider/SessionPoolAdapter.cs index 006b1c3..e836672 100644 --- a/src/JiShe.CollectBus.IoTDBProvider/Provider/SessionPoolAdapter.cs +++ b/src/JiShe.CollectBus.IoTDBProvider/Provider/SessionPoolAdapter.cs @@ -54,6 +54,11 @@ namespace JiShe.CollectBus.IoTDBProvider.Provider public async Task InsertAsync(Tablet tablet) { var result = await _sessionPool.InsertAlignedTabletAsync(tablet); + if (result != 0) + { + throw new Exception($"{nameof(TableSessionPoolAdapter)} "); + } + return result; }