concave_hull\
twkb
+ifeq ($(shell expr $(POSTGIS_PGSQL_VERSION) ">=" 91),1)
+ # Index supported KNN only available in PostgreSQL 9.1 and higher
+ TESTS += knn
+endif
+
ifeq ($(shell expr $(POSTGIS_GEOS_VERSION) ">=" 32),1)
# GEOS-3.3 adds:
# ST_HausdorffDistance, ST_Buffer(params)
--- /dev/null
+CREATE OR REPLACE FUNCTION qnodes(q text) RETURNS text
+LANGUAGE 'plpgsql' AS
+$$
+DECLARE
+ exp TEXT;
+ mat TEXT[];
+ ret TEXT[];
+BEGIN
+ FOR exp IN EXECUTE 'EXPLAIN ' || q
+ LOOP
+ --RAISE NOTICE 'EXP: %', exp;
+ mat := regexp_matches(exp, ' *(?:-> *)?(.*Scan)');
+ --RAISE NOTICE 'MAT: %', mat;
+ IF mat IS NOT NULL THEN
+ ret := array_append(ret, mat[1]);
+ END IF;
+ --RAISE NOTICE 'RET: %', ret;
+ END LOOP;
+ RETURN array_to_string(ret,',');
+END;
+$$;
+
+\i regress_lots_of_points.sql
+CREATE INDEX on test using gist (the_geom);
+
+-- Index-supported KNN query
+
+SELECT '<-> idx', qnodes('select * from test order by the_geom <-> ST_MakePoint(0,0)');
+SELECT '<-> res1',num,
+ (the_geom <-> 'LINESTRING(0 0,5 5)'::geometry)::numeric(10,2),
+ ST_astext(the_geom) from test
+ order by the_geom <-> 'LINESTRING(0 0,5 5)'::geometry LIMIT 1;
+
+-- Full table extent: BOX(0.0439142361 0.0197799355,999.955261 999.993652)
+SELECT '<#> idx', qnodes('select * from test order by the_geom <#> ST_MakePoint(0,0)');
+SELECT '<#> res1',num,
+ (the_geom <#> 'LINESTRING(1000 0,1005 5)'::geometry)::numeric(10,2),
+ ST_astext(the_geom) from test
+ order by the_geom <#> 'LINESTRING(1000 0,1005 5)'::geometry LIMIT 1;
+
+DROP FUNCTION qnodes(text);
+
+DROP TABLE test;
--- /dev/null
+<-> idx|Index Scan
+<-> res1|48589|0.17|POINT(2.33793712 2.44566727)
+<#> idx|Index Scan
+<#> res1|2057|0.83|POINT(999.173279 3.92185807)
SELECT 'scan_seq', qnodes('select * from test where the_geom && ST_MakePoint(0,0)');
select num,ST_astext(the_geom) from test where the_geom && 'BOX3D(125 125,135 135)'::box3d order by num;
--- Index-supported KNN query
-
-SELECT '<-> idx', qnodes('select * from test order by the_geom <-> ST_MakePoint(0,0)');
-SELECT '<-> res1',num,
- (the_geom <-> 'LINESTRING(0 0,5 5)'::geometry)::numeric(10,2),
- ST_astext(the_geom) from test
- order by the_geom <-> 'LINESTRING(0 0,5 5)'::geometry LIMIT 1;
-
--- Full table extent: BOX(0.0439142361 0.0197799355,999.955261 999.993652)
-SELECT '<#> idx', qnodes('select * from test order by the_geom <#> ST_MakePoint(0,0)');
-SELECT '<#> res1',num,
- (the_geom <#> 'LINESTRING(1000 0,1005 5)'::geometry)::numeric(10,2),
- ST_astext(the_geom) from test
- order by the_geom <#> 'LINESTRING(1000 0,1005 5)'::geometry LIMIT 1;
-
CREATE FUNCTION estimate_error(qry text, tol int)
RETURNS text
LANGUAGE 'plpgsql' VOLATILE AS $$
2594|POINT(130.504303 126.53112)
3618|POINT(130.447205 131.655289)
7245|POINT(128.10466 130.94133)
-<-> idx|Index Scan
-<-> res1|48589|0.17|POINT(2.33793712 2.44566727)
-<#> idx|Index Scan
-<#> res1|2057|0.83|POINT(999.173279 3.92185807)
3+=5:true
924+=60:true
12621+=500:true