Skip to content

Commit 2517327

Browse files
committed
radius index
sample: SELECT * FROM SpatialIndex.Test WHERE %ID %FIND search_index(x1F,'radius','x=55,y=55,radius=2') and name %StartsWith 'Z' or SELECT * FROM SpatialIndex.Test WHERE %ID %FIND search_index(x1F,'radius','x=55,y=55,radiusX=2,radiusY=2') and name %StartsWith 'Z'
1 parent d1ce600 commit 2517327

File tree

1 file changed

+37
-12
lines changed

1 file changed

+37
-12
lines changed

SpatialIndex_SQLResult.xml

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@
2323
<FormalSpec>indexGlobal:%String,queryType:%String,queryParams:%Binary</FormalSpec>
2424
<ReturnType>%Status</ReturnType>
2525
<Implementation><![CDATA[
26-
//for now we only have queryType = window
27-
for i = 1:1:4 {
28-
set item = $Piece(queryParams, ",", i)
29-
set param = $Piece(item, "=", 1)
30-
set value = $Piece(item, "=" ,2)
31-
set arg(param) = value
32-
}
33-
//set rset = ##class(%ResultSet).%New("SpatialIndex.QueryExecutor:FindWindow")
34-
//do rset.Execute(indexGlobal,arg("minx"),arg("miny"),arg("maxx"),arg("maxy"))
35-
//while (rset.Next()){
36-
// set id = rset.Get("Id")
26+
if queryType = "window" {
27+
for i = 1:1:4 {
28+
set item = $Piece(queryParams, ",", i)
29+
set param = $Piece(item, "=", 1)
30+
set value = $Piece(item, "=" ,2)
31+
set arg(param) = value
32+
}
33+
//set rset = ##class(%ResultSet).%New("SpatialIndex.QueryExecutor:FindWindow")
34+
//do rset.Execute(indexGlobal,arg("minx"),arg("miny"),arg("maxx"),arg("maxy"))
35+
//while (rset.Next()){
36+
// set id = rset.Get("Id")
3737
set qHandle("indexGlobal") = indexGlobal
3838
do ##class(SpatialIndex.QueryExecutor).InternalFindWindow(.qHandle,arg("minx"),arg("miny"),arg("maxx"),arg("maxy"))
3939
set id = ""
@@ -43,7 +43,32 @@
4343
set tChunk = (id\64000)+1, tPos=(id#64000)+1
4444
set $BIT(i%ResultBits(tChunk),tPos) = 1
4545
}
46-
quit $$$OK
46+
}elseif queryType = "radius" {
47+
/*
48+
SELECT *
49+
FROM SpatialIndex.Test
50+
WHERE %ID %FIND search_index(x1F,'radius','x=55,y=55,radius=100m')
51+
and name %StartsWith 'Z'
52+
*/
53+
for i = 1:1:$L(queryParams, ",") {
54+
set item = $Piece(queryParams, ",", i)
55+
set param = $Piece(item, "=", 1)
56+
set value = $Piece(item, "=" ,2)
57+
set arg(param) = value
58+
}
59+
set qHandle("indexGlobal") = indexGlobal
60+
set arg("radiusX") = $G(arg("radiusX"),arg("radius"))
61+
set arg("radiusY") = $G(arg("radiusY"),arg("radius"))
62+
do ##class(SpatialIndex.QueryExecutor).InternalFindRadius(.qHandle,arg("x"),arg("y"),arg("radiusX"),arg("radiusY"))
63+
set id = ""
64+
for {
65+
set id = $O(qHandle("data", id))
66+
quit:id=""
67+
set tChunk = (id\64000)+1, tPos=(id#64000)+1
68+
set $BIT(i%ResultBits(tChunk),tPos) = 1
69+
}
70+
}
71+
quit $$$OK
4772
]]></Implementation>
4873
</Method>
4974

0 commit comments

Comments
 (0)