Skip to content

Commit 970c35e

Browse files
Merge pull request #31 from estebanzimanyi/feat/array-arguments-from-the-catalog
Read from the catalog which arguments are arrays
2 parents 71ef2dd + a4f020d commit 970c35e

6 files changed

Lines changed: 302 additions & 33 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using MEOS.NET.Types;
2+
3+
namespace MEOS.NET.Tests
4+
{
5+
/// <summary>
6+
/// An array MEOS reads is one parameter to the caller and two to MEOS, the
7+
/// pointer and its length. The catalog names both, so a method takes the
8+
/// array whatever MEOS calls the length.
9+
/// </summary>
10+
[TestClass]
11+
public class ArrayArgumentTests : MeosTest
12+
{
13+
[TestMethod]
14+
public void ASetIsBuiltFromAnArrayOfGeometries()
15+
{
16+
Geo[] points =
17+
{
18+
Geo.FromText("POINT(1 1)", 0)!,
19+
Geo.FromText("POINT(2 2)", 0)!,
20+
};
21+
22+
Set? set = GeomSet.Make(points);
23+
24+
Assert.IsNotNull(set);
25+
Assert.AreEqual(2, set!.NumValues());
26+
}
27+
28+
[TestMethod]
29+
public void AJsonbIsQueriedWithAnArrayOfKeysWhoseLengthIsNotNamedCount()
30+
{
31+
// `jsonb_exists_array(jb, text **keys_elems, int keys_len, bool any)`
32+
// — the length is `keys_len`, and the catalog is what says so.
33+
Jsonb jb = Jsonb.In("{\"a\": 1, \"b\": 2}")!;
34+
Text[] keys = { Text.In("a")!, Text.In("z")! };
35+
36+
Assert.IsTrue(jb.ExistsArray(keys, true));
37+
Assert.IsFalse(jb.ExistsArray(keys, false));
38+
39+
Text[] missing = { Text.In("y")!, Text.In("z")! };
40+
41+
Assert.IsFalse(jb.ExistsArray(missing, true));
42+
}
43+
}
44+
}

MEOS.NET/Types/Geo.g.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,63 @@ public ulong ToQuadbinCell(int resolution)
111111
public STBox? TstzspanToStbox(Span s)
112112
=> MEOSFactory.WrapSTBox(Meos.GeoTstzspanToStbox(this.Ptr, s.Ptr));
113113

114+
public static Geo?[] ClusterIntersecting(Geo[] geoms)
115+
{
116+
IntPtr[] _geomsValues = new IntPtr[geoms.Length];
117+
for (int i = 0; i < geoms.Length; i++)
118+
{
119+
_geomsValues[i] = geoms[i].Ptr;
120+
}
121+
122+
GCHandle _geoms = GCHandle.Alloc(_geomsValues, GCHandleType.Pinned);
123+
try
124+
{
125+
return MEOSFactory.WrapGeoArray(Meos.GeoClusterIntersecting(_geoms.AddrOfPinnedObject(), (uint) geoms.Length));
126+
}
127+
finally
128+
{
129+
_geoms.Free();
130+
}
131+
}
132+
133+
public static int[] ClusterKmeans(Geo[] geoms, uint k)
134+
{
135+
IntPtr[] _geomsValues = new IntPtr[geoms.Length];
136+
for (int i = 0; i < geoms.Length; i++)
137+
{
138+
_geomsValues[i] = geoms[i].Ptr;
139+
}
140+
141+
GCHandle _geoms = GCHandle.Alloc(_geomsValues, GCHandleType.Pinned);
142+
try
143+
{
144+
return Meos.GeoClusterKmeans(_geoms.AddrOfPinnedObject(), (uint) geoms.Length, k);
145+
}
146+
finally
147+
{
148+
_geoms.Free();
149+
}
150+
}
151+
152+
public static Geo?[] ClusterWithin(Geo[] geoms, double tolerance)
153+
{
154+
IntPtr[] _geomsValues = new IntPtr[geoms.Length];
155+
for (int i = 0; i < geoms.Length; i++)
156+
{
157+
_geomsValues[i] = geoms[i].Ptr;
158+
}
159+
160+
GCHandle _geoms = GCHandle.Alloc(_geomsValues, GCHandleType.Pinned);
161+
try
162+
{
163+
return MEOSFactory.WrapGeoArray(Meos.GeoClusterWithin(_geoms.AddrOfPinnedObject(), (uint) geoms.Length, tolerance));
164+
}
165+
finally
166+
{
167+
_geoms.Free();
168+
}
169+
}
170+
114171
public static Geo? CollectGarray(Geo[] gsarr)
115172
{
116173
IntPtr[] _gsarrValues = new IntPtr[gsarr.Length];
@@ -130,6 +187,19 @@ public ulong ToQuadbinCell(int resolution)
130187
}
131188
}
132189

190+
public static Geo? FromEWKB(byte[] wkb, int srid)
191+
{
192+
GCHandle _wkb = GCHandle.Alloc(wkb, GCHandleType.Pinned);
193+
try
194+
{
195+
return MEOSFactory.WrapGeo(Meos.GeoFromEwkb(_wkb.AddrOfPinnedObject(), (ulong) wkb.Length, srid));
196+
}
197+
finally
198+
{
199+
_wkb.Free();
200+
}
201+
}
202+
133203
public static Geo? FromGEOJSON(string geojson)
134204
=> MEOSFactory.WrapGeo(Meos.GeoFromGeojson(geojson));
135205

MEOS.NET/Types/Jsonb.g.cs

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,132 @@ public bool Contained(Jsonb jb2)
4545
public Jsonb? Delete(Text key)
4646
=> MEOSFactory.WrapJsonb(Meos.JsonbDelete(this.Ptr, key.Ptr));
4747

48+
public Jsonb? DeleteArray(Text[] keys_elems)
49+
{
50+
IntPtr[] _keys_elemsValues = new IntPtr[keys_elems.Length];
51+
for (int i = 0; i < keys_elems.Length; i++)
52+
{
53+
_keys_elemsValues[i] = keys_elems[i].Ptr;
54+
}
55+
56+
GCHandle _keys_elems = GCHandle.Alloc(_keys_elemsValues, GCHandleType.Pinned);
57+
try
58+
{
59+
return MEOSFactory.WrapJsonb(Meos.JsonbDeleteArray(this.Ptr, _keys_elems.AddrOfPinnedObject(), keys_elems.Length));
60+
}
61+
finally
62+
{
63+
_keys_elems.Free();
64+
}
65+
}
66+
4867
public Jsonb? DeleteIndex(int idx)
4968
=> MEOSFactory.WrapJsonb(Meos.JsonbDeleteIndex(this.Ptr, idx));
5069

70+
public Jsonb? DeletePath(Text[] path_elems)
71+
{
72+
IntPtr[] _path_elemsValues = new IntPtr[path_elems.Length];
73+
for (int i = 0; i < path_elems.Length; i++)
74+
{
75+
_path_elemsValues[i] = path_elems[i].Ptr;
76+
}
77+
78+
GCHandle _path_elems = GCHandle.Alloc(_path_elemsValues, GCHandleType.Pinned);
79+
try
80+
{
81+
return MEOSFactory.WrapJsonb(Meos.JsonbDeletePath(this.Ptr, _path_elems.AddrOfPinnedObject(), path_elems.Length));
82+
}
83+
finally
84+
{
85+
_path_elems.Free();
86+
}
87+
}
88+
5189
public bool Exists(Text key)
5290
=> Meos.JsonbExists(this.Ptr, key.Ptr);
5391

92+
public bool ExistsArray(Text[] keys_elems, bool any)
93+
{
94+
IntPtr[] _keys_elemsValues = new IntPtr[keys_elems.Length];
95+
for (int i = 0; i < keys_elems.Length; i++)
96+
{
97+
_keys_elemsValues[i] = keys_elems[i].Ptr;
98+
}
99+
100+
GCHandle _keys_elems = GCHandle.Alloc(_keys_elemsValues, GCHandleType.Pinned);
101+
try
102+
{
103+
return Meos.JsonbExistsArray(this.Ptr, _keys_elems.AddrOfPinnedObject(), keys_elems.Length, any);
104+
}
105+
finally
106+
{
107+
_keys_elems.Free();
108+
}
109+
}
110+
111+
public Jsonb? ExtractPath(Text[] path_elems)
112+
{
113+
IntPtr[] _path_elemsValues = new IntPtr[path_elems.Length];
114+
for (int i = 0; i < path_elems.Length; i++)
115+
{
116+
_path_elemsValues[i] = path_elems[i].Ptr;
117+
}
118+
119+
GCHandle _path_elems = GCHandle.Alloc(_path_elemsValues, GCHandleType.Pinned);
120+
try
121+
{
122+
return MEOSFactory.WrapJsonb(Meos.JsonbExtractPath(this.Ptr, _path_elems.AddrOfPinnedObject(), path_elems.Length));
123+
}
124+
finally
125+
{
126+
_path_elems.Free();
127+
}
128+
}
129+
130+
public Text? ExtractPathText(Text[] path_elems)
131+
{
132+
IntPtr[] _path_elemsValues = new IntPtr[path_elems.Length];
133+
for (int i = 0; i < path_elems.Length; i++)
134+
{
135+
_path_elemsValues[i] = path_elems[i].Ptr;
136+
}
137+
138+
GCHandle _path_elems = GCHandle.Alloc(_path_elemsValues, GCHandleType.Pinned);
139+
try
140+
{
141+
return MEOSFactory.WrapText(Meos.JsonbExtractPathText(this.Ptr, _path_elems.AddrOfPinnedObject(), path_elems.Length));
142+
}
143+
finally
144+
{
145+
_path_elems.Free();
146+
}
147+
}
148+
54149
public uint Hash()
55150
=> Meos.JsonbHash(this.Ptr);
56151

57152
public ulong HashExtended(ulong seed)
58153
=> Meos.JsonbHashExtended(this.Ptr, seed);
59154

155+
public Jsonb? Insert(Text[] path_elems, Jsonb newjb, bool after)
156+
{
157+
IntPtr[] _path_elemsValues = new IntPtr[path_elems.Length];
158+
for (int i = 0; i < path_elems.Length; i++)
159+
{
160+
_path_elemsValues[i] = path_elems[i].Ptr;
161+
}
162+
163+
GCHandle _path_elems = GCHandle.Alloc(_path_elemsValues, GCHandleType.Pinned);
164+
try
165+
{
166+
return MEOSFactory.WrapJsonb(Meos.JsonbInsert(this.Ptr, _path_elems.AddrOfPinnedObject(), path_elems.Length, newjb.Ptr, after));
167+
}
168+
finally
169+
{
170+
_path_elems.Free();
171+
}
172+
}
173+
60174
public Jsonb? ObjectField(Text key)
61175
=> MEOSFactory.WrapJsonb(Meos.JsonbObjectField(this.Ptr, key.Ptr));
62176

@@ -72,6 +186,44 @@ public string Out()
72186
public Text? Pretty()
73187
=> MEOSFactory.WrapText(Meos.JsonbPretty(this.Ptr));
74188

189+
public Jsonb? Set(Text[] path_elems, Jsonb newjb, bool create)
190+
{
191+
IntPtr[] _path_elemsValues = new IntPtr[path_elems.Length];
192+
for (int i = 0; i < path_elems.Length; i++)
193+
{
194+
_path_elemsValues[i] = path_elems[i].Ptr;
195+
}
196+
197+
GCHandle _path_elems = GCHandle.Alloc(_path_elemsValues, GCHandleType.Pinned);
198+
try
199+
{
200+
return MEOSFactory.WrapJsonb(Meos.JsonbSet(this.Ptr, _path_elems.AddrOfPinnedObject(), path_elems.Length, newjb.Ptr, create));
201+
}
202+
finally
203+
{
204+
_path_elems.Free();
205+
}
206+
}
207+
208+
public Jsonb? SetLax(Text[] path_elems, Jsonb newjb, bool create, Text handle_null)
209+
{
210+
IntPtr[] _path_elemsValues = new IntPtr[path_elems.Length];
211+
for (int i = 0; i < path_elems.Length; i++)
212+
{
213+
_path_elemsValues[i] = path_elems[i].Ptr;
214+
}
215+
216+
GCHandle _path_elems = GCHandle.Alloc(_path_elemsValues, GCHandleType.Pinned);
217+
try
218+
{
219+
return MEOSFactory.WrapJsonb(Meos.JsonbSetLax(this.Ptr, _path_elems.AddrOfPinnedObject(), path_elems.Length, newjb.Ptr, create, handle_null.Ptr));
220+
}
221+
finally
222+
{
223+
_path_elems.Free();
224+
}
225+
}
226+
75227
public Jsonb? StripNulls(bool strip_in_arrays)
76228
=> MEOSFactory.WrapJsonb(Meos.JsonbStripNulls(this.Ptr, strip_in_arrays));
77229

MEOS.NET/Types/SpanSet.g.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,8 @@ public bool UpperInc()
130130
}
131131
}
132132

133+
public static SpanSet? Make(Span spans, int count)
134+
=> MEOSFactory.WrapSpanSet(Meos.SpansetMake(spans.Ptr, count));
135+
133136
}
134137
}

MEOS.NET/Types/TJsonb.g.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,25 @@ public override string ToString()
4949
public Temporal? DeleteIndex(int idx)
5050
=> MEOSFactory.WrapTemporal(Meos.TjsonbDeleteIndex(this.Ptr, idx));
5151

52+
public Temporal? DeletePath(Text[] path_elems)
53+
{
54+
IntPtr[] _path_elemsValues = new IntPtr[path_elems.Length];
55+
for (int i = 0; i < path_elems.Length; i++)
56+
{
57+
_path_elemsValues[i] = path_elems[i].Ptr;
58+
}
59+
60+
GCHandle _path_elems = GCHandle.Alloc(_path_elemsValues, GCHandleType.Pinned);
61+
try
62+
{
63+
return MEOSFactory.WrapTemporal(Meos.TjsonbDeletePath(this.Ptr, _path_elems.AddrOfPinnedObject(), path_elems.Length));
64+
}
65+
finally
66+
{
67+
_path_elems.Free();
68+
}
69+
}
70+
5271
public Jsonb? EndValue()
5372
=> MEOSFactory.WrapJsonb(Meos.TjsonbEndValue(this.Ptr));
5473

0 commit comments

Comments
 (0)