diff --git a/ZeroLevel.Qdrant/Models/Filters/Condition.cs b/ZeroLevel.Qdrant/Models/Filters/Condition.cs index 4a6d865..68832a8 100644 --- a/ZeroLevel.Qdrant/Models/Filters/Condition.cs +++ b/ZeroLevel.Qdrant/Models/Filters/Condition.cs @@ -26,27 +26,27 @@ { return new Condition { - Json = $"{{ \"key\": \"{name}\", \"match\": {{ \"integer\": \"{value}\" }} }}" + Json = $"{{ \"key\": \"{name.ToLowerInvariant()}\", \"match\": {{ \"integer\": {value} }} }}" }; } public static Condition IntegerRange(string name, long left, long rigth, bool include_left, bool include_right) { - var left_cond = include_left ? $"\"lt\": null,\"lte\": {left}" : $"\"lt\": {left},\"lte\": null"; - var right_cond = include_right ? $"\"gt\": null,\"gte\": {rigth}" : $"\"gt\": {rigth},\"gte\": null"; + var left_cond = include_left ? $"\"lt\": null,\"lte\": {rigth}" : $"\"lt\": {rigth},\"lte\": null"; + var right_cond = include_right ? $"\"gt\": null,\"gte\": {left}" : $"\"gt\": {left},\"gte\": null"; return new Condition { - Json = $"{{ \"key\": \"{name}\", \"range\": {{ {right_cond}, {left_cond} }} }}" + Json = $"{{ \"key\": \"{name.ToLowerInvariant()}\", \"range\": {{ {right_cond}, {left_cond} }} }}" }; } public static Condition FloatRange(string name, double left, double rigth, bool include_left, bool include_right) { - var left_cond = include_left ? $"\"lt\": null,\"lte\": {left.ConvertToString()}" : $"\"lt\": {left.ConvertToString()},\"lte\": null"; - var right_cond = include_right ? $"\"gt\": null,\"gte\": {rigth.ConvertToString()}" : $"\"gt\": {rigth.ConvertToString()},\"gte\": null"; + var left_cond = include_left ? $"\"lt\": null,\"lte\": {rigth.ConvertToString()}" : $"\"lt\": {rigth.ConvertToString()},\"lte\": null"; + var right_cond = include_right ? $"\"gt\": null,\"gte\": {left.ConvertToString()}" : $"\"gt\": {left.ConvertToString()},\"gte\": null"; return new Condition { - Json = $"{{ \"key\": \"{name}\", \"range\": {{ {left_cond}, {right_cond} }} }}" + Json = $"{{ \"key\": \"{name.ToLowerInvariant()}\", \"range\": {{ {left_cond}, {right_cond} }} }}" }; } @@ -54,7 +54,7 @@ { return new Condition { - Json = $"{{ \"key\": \"{name}\", \"match\": {{ \"keyword\": \"{value}\" }} }}" + Json = $"{{ \"key\": \"{name.ToLowerInvariant()}\", \"match\": {{ \"keyword\": \"{value}\" }} }}" }; } @@ -62,7 +62,7 @@ { return new Condition { - Json = $"{{ \"key\": \"{name}\", \"geo_bounding_box\": {{ \"bottom_right\": {{ \"lat\": {bottom_right.lat.ConvertToString()}, \"lon\": {bottom_right.lon.ConvertToString()} }}, \"top_left\": {{ \"lat\": {top_left.lat.ConvertToString()}, \"lon\": {top_left.lon.ConvertToString()} }} }} }}" + Json = $"{{ \"key\": \"{name.ToLowerInvariant()}\", \"geo_bounding_box\": {{ \"bottom_right\": {{ \"lat\": {bottom_right.lat.ConvertToString()}, \"lon\": {bottom_right.lon.ConvertToString()} }}, \"top_left\": {{ \"lat\": {top_left.lat.ConvertToString()}, \"lon\": {top_left.lon.ConvertToString()} }} }} }}" }; } @@ -70,7 +70,7 @@ { return new Condition { - Json = $"{{\"key\": \"{name}\", \"geo_radius\": {{\"center\": {{ \"lat\": {location.lat.ConvertToString()}, \"lon\": {location.lon.ConvertToString()} }}, \"radius\": {radius.ConvertToString()} }} }}" + Json = $"{{\"key\": \"{name.ToLowerInvariant()}\", \"geo_radius\": {{\"center\": {{ \"lat\": {location.lat.ConvertToString()}, \"lon\": {location.lon.ConvertToString()} }}, \"radius\": {radius.ConvertToString()} }} }}" }; } public override string ToJSON() diff --git a/ZeroLevel.Qdrant/Models/Filters/Group.cs b/ZeroLevel.Qdrant/Models/Filters/Group.cs index a03a9be..0571b08 100644 --- a/ZeroLevel.Qdrant/Models/Filters/Group.cs +++ b/ZeroLevel.Qdrant/Models/Filters/Group.cs @@ -33,7 +33,7 @@ namespace ZeroLevel.Qdrant.Models.Filters { case GroupOperator.MustNot: op = "must_not"; break; case GroupOperator.Must: op = "must"; break; - default: op = "mushould"; break; + default: op = "should"; break; } return $"\"{op}\": [{string.Join(",", _items.Select(i => i.ToJSON()))}]"; } diff --git a/ZeroLevel.Qdrant/Models/Requests/PointsUploadRequest.cs b/ZeroLevel.Qdrant/Models/Requests/PointsUploadRequest.cs index b4b55a1..9c2cf7f 100644 --- a/ZeroLevel.Qdrant/Models/Requests/PointsUploadRequest.cs +++ b/ZeroLevel.Qdrant/Models/Requests/PointsUploadRequest.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Text; using ZeroLevel.Qdrant.Services; using ZeroLevel.Services.Collections; @@ -35,11 +36,20 @@ namespace ZeroLevel.Qdrant.Models.Requests } var converter = _cachee.Get>("converter"); + Func, string> p_conv = up => + { + if (up.id != null) + { + return $"\"id\": {up.id}, \"payload\": {{ {converter.ToJson(up.payload)} }}, \"vector\": [{ string.Join(",", up.vector.Select(f => f.ConvertToString()))}]"; + } + return $"\"payload\": {{ {converter.ToJson(up.payload)} }}, \"vector\": [{ string.Join(",", up.vector.Select(f => f.ConvertToString()))}]"; + }; + var json = new StringBuilder(); json.Append("{"); json.Append("\"upsert_points\": {"); json.Append("\"points\":[ {"); - json.Append(string.Join("},{", upsert_points.points.Select(p => $"\"id\": {p.id}, \"payload\": {{ {converter.ToJson(p.payload)} }}, \"vector\": [{ string.Join(",", p.vector.Select(f => f.ConvertToString()))}]"))); + json.Append(string.Join("},{", upsert_points.points.Select(p => p_conv(p)))); json.Append("}]"); json.Append("}"); json.Append("}"); @@ -76,7 +86,10 @@ namespace ZeroLevel.Qdrant.Models.Requests json.Append("{"); json.Append("\"upsert_points\": {"); json.Append("\"batch\": {"); - json.Append($"\"ids\": [{string.Join(",", upsert_points.batch.ids)}], "); + if (upsert_points.batch.ids != null && upsert_points.batch.ids.Length > 0) + { + json.Append($"\"ids\": [{string.Join(",", upsert_points.batch.ids)}], "); + } json.Append($"\"payloads\": [ {{ {string.Join("} ,{ ", upsert_points.batch.payloads.Select(payload => converter.ToJson(payload)))} }} ], "); json.Append($"\"vectors\": [{string.Join(",", Enumerable.Range(0, upsert_points.batch.vectors.GetLength(0)).Select(row => "[" + string.Join(",", ArrayExtensions.GetRow(upsert_points.batch.vectors, row).Select(f => f.ConvertToString())) + "]"))}]"); json.Append("}"); diff --git a/ZeroLevel.Qdrant/Services/QdrantJsonConverter.cs b/ZeroLevel.Qdrant/Services/QdrantJsonConverter.cs index f17035e..69aec5f 100644 --- a/ZeroLevel.Qdrant/Services/QdrantJsonConverter.cs +++ b/ZeroLevel.Qdrant/Services/QdrantJsonConverter.cs @@ -100,25 +100,25 @@ namespace ZeroLevel.Qdrant.Services if (TypeHelpers.IsEnumerable(member.ClrType) && TypeHelpers.IsString(member.ClrType) == false) { var arr = val as IEnumerable; - json.Append($"\"{member.Name}\": {{ \"type\": \"keyword\", \"value\": [ {string.Join(", ", E(arr).Select(v => KeywordToString(member, v)))}] }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"keyword\", \"value\": [ {string.Join(", ", E(arr).Select(v => KeywordToString(member, v)))}] }},"); } else { - json.Append($"\"{member.Name}\": {{ \"type\": \"keyword\", \"value\":{KeywordToString(member, val)} }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"keyword\", \"value\":{KeywordToString(member, val)} }},"); } break; case GEO_TYPE: if (TypeHelpers.IsEnumerable(member.ClrType) && TypeHelpers.IsString(member.ClrType) == false) { var arr = val as IEnumerable; - json.Append($"\"{member.Name}\": {{ \"type\": \"geo\", \"value\": [ {string.Join(",", E(arr).Select(v => v as Location).Where(l => l != null).Select(l => $" {{ \"lon\":{l.lon.ConvertToString()}, \"lat\":{l.lat.ConvertToString()} }}"))}] }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"geo\", \"value\": [ {string.Join(",", E(arr).Select(v => v as Location).Where(l => l != null).Select(l => $" {{ \"lon\":{l.lon.ConvertToString()}, \"lat\":{l.lat.ConvertToString()} }}"))}] }},"); } else { Location l = val as Location; if (l != null) { - json.Append($"\"{member.Name}\": {{ \"type\": \"geo\", \"value\": {{ \"lon\":{l.lon.ConvertToString()}, \"lat\":{l.lat.ConvertToString()} }} }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"geo\", \"value\": {{ \"lon\":{l.lon.ConvertToString()}, \"lat\":{l.lat.ConvertToString()} }} }},"); } } break; @@ -126,23 +126,23 @@ namespace ZeroLevel.Qdrant.Services if (TypeHelpers.IsEnumerable(member.ClrType) && TypeHelpers.IsString(member.ClrType) == false) { var arr = val as IEnumerable; - json.Append($"\"{member.Name}\": {{ \"type\": \"float\", \"value\": [ {string.Join(",", E(arr).Select(v => Convert.ToDouble(v).ConvertToString()))}] }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"float\", \"value\": [ {string.Join(",", E(arr).Select(v => Convert.ToDouble(v).ConvertToString()))}] }},"); } else { - json.Append($"\"{member.Name}\": {{ \"type\": \"float\", \"value\": {Convert.ToDouble(val).ConvertToString()} }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"float\", \"value\": {Convert.ToDouble(val).ConvertToString()} }},"); } break; case INTEGER_TYPE: if (TypeHelpers.IsEnumerable(member.ClrType) && TypeHelpers.IsString(member.ClrType) == false) { var arr = val as IEnumerable; - json.Append($"\"{member.Name}\": {{ \"type\": \"integer\", \"value\": [ {string.Join(",", E(arr).Select(v => Convert.ToInt64(v)))}] }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"integer\", \"value\": [ {string.Join(",", E(arr).Select(v => Convert.ToInt64(v)))}] }},"); } else { - json.Append($"\"{member.Name}\": {{ \"type\": \"integer\", \"value\": {Convert.ToInt64(val)} }},"); + json.Append($"\"{member.Name.ToLowerInvariant()}\": {{ \"type\": \"integer\", \"value\": {Convert.ToInt64(val)} }},"); } break; }