|
| 1 | +namespace Milvus.Client; |
| 2 | + |
| 3 | +/// <summary> |
| 4 | +/// Binary Field |
| 5 | +/// </summary> |
| 6 | +public sealed class ArrayFieldData<TElementData> : FieldData<IReadOnlyList<TElementData>> |
| 7 | +{ |
| 8 | + /// <summary> |
| 9 | + /// Construct an array field |
| 10 | + /// </summary> |
| 11 | + /// <param name="fieldName"></param> |
| 12 | + /// <param name="data"></param> |
| 13 | + /// <param name="isDynamic"></param> |
| 14 | + public ArrayFieldData(string fieldName, IReadOnlyList<IReadOnlyList<TElementData>> data, bool isDynamic) |
| 15 | + : base(fieldName, data, MilvusDataType.Array, isDynamic) |
| 16 | + { |
| 17 | + ElementType = EnsureDataType<TElementData>(); |
| 18 | + } |
| 19 | + |
| 20 | + /// <summary> |
| 21 | + /// Array element type |
| 22 | + /// </summary> |
| 23 | + public MilvusDataType ElementType { get; } |
| 24 | + |
| 25 | + /// <inheritdoc /> |
| 26 | + internal override Grpc.FieldData ToGrpcFieldData() |
| 27 | + { |
| 28 | + Check(); |
| 29 | + |
| 30 | + Grpc.FieldData fieldData = new() |
| 31 | + { |
| 32 | + Type = Grpc.DataType.Array, |
| 33 | + IsDynamic = IsDynamic |
| 34 | + }; |
| 35 | + |
| 36 | + if (FieldName is not null) |
| 37 | + { |
| 38 | + fieldData.FieldName = FieldName; |
| 39 | + } |
| 40 | + |
| 41 | + var arrayArray = new ArrayArray |
| 42 | + { |
| 43 | + ElementType = (DataType) ElementType, |
| 44 | + }; |
| 45 | + |
| 46 | + fieldData.Scalars = new ScalarField |
| 47 | + { |
| 48 | + ArrayData = arrayArray |
| 49 | + }; |
| 50 | + |
| 51 | + foreach (var array in Data) |
| 52 | + { |
| 53 | + switch (ElementType) |
| 54 | + { |
| 55 | + case MilvusDataType.Bool: |
| 56 | + BoolArray boolData = new(); |
| 57 | + boolData.Data.AddRange(array as IEnumerable<bool>); |
| 58 | + arrayArray.Data.Add(new ScalarField { BoolData = boolData, }); |
| 59 | + break; |
| 60 | + |
| 61 | + case MilvusDataType.Int8: |
| 62 | + IntArray int8Data = new(); |
| 63 | + var sbytes = array as IEnumerable<sbyte> ?? Enumerable.Empty<sbyte>(); |
| 64 | + int8Data.Data.AddRange(sbytes.Select(x => (int) x)); |
| 65 | + arrayArray.Data.Add(new ScalarField { IntData = int8Data, }); |
| 66 | + break; |
| 67 | + |
| 68 | + case MilvusDataType.Int16: |
| 69 | + IntArray int16Data = new(); |
| 70 | + var shorts = array as IEnumerable<short> ?? Enumerable.Empty<short>(); |
| 71 | + int16Data.Data.AddRange(shorts.Select(x => (int) x)); |
| 72 | + arrayArray.Data.Add(new ScalarField { IntData = int16Data, }); |
| 73 | + break; |
| 74 | + |
| 75 | + case MilvusDataType.Int32: |
| 76 | + IntArray int32Data = new(); |
| 77 | + int32Data.Data.AddRange(array as IEnumerable<int>); |
| 78 | + arrayArray.Data.Add(new ScalarField { IntData = int32Data, }); |
| 79 | + break; |
| 80 | + |
| 81 | + case MilvusDataType.Int64: |
| 82 | + LongArray int64Data = new(); |
| 83 | + int64Data.Data.AddRange(array as IEnumerable<long>); |
| 84 | + arrayArray.Data.Add(new ScalarField { LongData = int64Data, }); |
| 85 | + break; |
| 86 | + |
| 87 | + case MilvusDataType.Float: |
| 88 | + FloatArray floatData = new(); |
| 89 | + floatData.Data.AddRange(array as IEnumerable<float>); |
| 90 | + arrayArray.Data.Add(new ScalarField { FloatData = floatData, }); |
| 91 | + break; |
| 92 | + |
| 93 | + case MilvusDataType.Double: |
| 94 | + DoubleArray doubleData = new(); |
| 95 | + doubleData.Data.AddRange(array as IEnumerable<double>); |
| 96 | + arrayArray.Data.Add(new ScalarField { DoubleData = doubleData, }); |
| 97 | + break; |
| 98 | + |
| 99 | + case MilvusDataType.String: |
| 100 | + StringArray stringData = new(); |
| 101 | + stringData.Data.AddRange(array as IEnumerable<string>); |
| 102 | + arrayArray.Data.Add(new ScalarField { StringData = stringData, }); |
| 103 | + break; |
| 104 | + |
| 105 | + case MilvusDataType.VarChar: |
| 106 | + StringArray varcharData = new(); |
| 107 | + varcharData.Data.AddRange(array as IEnumerable<string>); |
| 108 | + arrayArray.Data.Add(new ScalarField { StringData = varcharData, }); |
| 109 | + break; |
| 110 | + |
| 111 | + case MilvusDataType.Json: |
| 112 | + JSONArray jsonData = new(); |
| 113 | + var enumerable = array as IEnumerable<string> ?? Enumerable.Empty<string>(); |
| 114 | + jsonData.Data.AddRange(enumerable.Select(ByteString.CopyFromUtf8)); |
| 115 | + arrayArray.Data.Add(new ScalarField { JsonData = jsonData, }); |
| 116 | + break; |
| 117 | + |
| 118 | + case MilvusDataType.None: |
| 119 | + throw new MilvusException($"ElementType Error:{DataType}"); |
| 120 | + |
| 121 | + default: |
| 122 | + throw new MilvusException($"ElementType Error:{DataType}, not supported"); |
| 123 | + } |
| 124 | + } |
| 125 | + |
| 126 | + return fieldData; |
| 127 | + } |
| 128 | + |
| 129 | + internal override object GetValueAsObject(int index) |
| 130 | + => ElementType switch |
| 131 | + { |
| 132 | + MilvusDataType.Bool => ((IReadOnlyList<IEnumerable<bool>>) Data)[index], |
| 133 | + MilvusDataType.Int8 => ((IReadOnlyList<IEnumerable<sbyte>>) Data)[index], |
| 134 | + MilvusDataType.Int16 => ((IReadOnlyList<IEnumerable<short>>) Data)[index], |
| 135 | + MilvusDataType.Int32 => ((IReadOnlyList<IEnumerable<int>>) Data)[index], |
| 136 | + MilvusDataType.Int64 => ((IReadOnlyList<IEnumerable<long>>) Data)[index], |
| 137 | + MilvusDataType.Float => ((IReadOnlyList<IEnumerable<float>>) Data)[index], |
| 138 | + MilvusDataType.Double => ((IReadOnlyList<IEnumerable<double>>) Data)[index], |
| 139 | + MilvusDataType.String => ((IReadOnlyList<IEnumerable<string>>) Data)[index], |
| 140 | + MilvusDataType.VarChar => ((IReadOnlyList<IEnumerable<string>>) Data)[index], |
| 141 | + |
| 142 | + MilvusDataType.None => throw new MilvusException($"DataType Error:{DataType}"), |
| 143 | + _ => throw new MilvusException($"DataType Error:{DataType}, not supported") |
| 144 | + }; |
| 145 | +} |
0 commit comments