]> git.openstreetmap.org Git - nominatim.git/blob - sql/partitions.src.sql
a47563f60b16208a54e9d303510527e4eff26a2c
[nominatim.git] / sql / partitions.src.sql
1 create type nearplace as (
2   place_id bigint
3 );
4
5 create type nearfeature as (
6   place_id bigint,
7   keywords int[],
8   rank_address integer,
9   rank_search integer,
10   distance float
11 );
12
13 CREATE TABLE location_area_country () INHERITS (location_area_large);
14 CREATE INDEX idx_location_area_country_geometry ON location_area_country USING GIST (geometry);
15
16 -- start
17 CREATE TABLE location_area_large_-partition- () INHERITS (location_area_large);
18 CREATE INDEX idx_location_area_large_-partition-_geometry ON location_area_large_-partition- USING GIST (geometry);
19
20 CREATE TABLE location_area_roadnear_-partition- () INHERITS (location_area_roadnear);
21 CREATE INDEX idx_location_area_roadnear_-partition-_geometry ON location_area_roadnear_-partition- USING GIST (geometry);
22
23 CREATE TABLE location_area_roadfar_-partition- () INHERITS (location_area_roadfar);
24 CREATE INDEX idx_location_area_roadfar_-partition-_geometry ON location_area_roadfar_-partition- USING GIST (geometry);
25 -- end
26
27 create or replace function getNearRoads(in_partition TEXT, point GEOMETRY) RETURNS setof nearplace AS $$
28 DECLARE
29   r nearplace%rowtype;
30   a BOOLEAN;
31 BEGIN
32
33 -- start
34   IF in_partition = '-partition-' THEN
35     a := FALSE;
36     FOR r IN SELECT place_id FROM location_area_roadnear_-partition- WHERE ST_Contains(geometry, point) ORDER BY ST_Distance(point, centroid) ASC LIMIT 1 LOOP
37       a := TRUE;
38       RETURN NEXT r;
39       RETURN;
40     END LOOP;
41     FOR r IN SELECT place_id FROM location_area_roadfar_-partition- WHERE ST_Contains(geometry, point) ORDER BY ST_Distance(point, centroid) ASC LOOP
42       RETURN NEXT r;
43       RETURN;
44     END LOOP;
45     RETURN;
46   END IF;
47 -- end
48
49   RAISE EXCEPTION 'Unknown partition %', in_partition;
50 END
51 $$
52 LANGUAGE plpgsql;
53
54 create or replace function getNearFeatures(in_partition TEXT, point GEOMETRY, maxrank INTEGER, isin_tokens INT[]) RETURNS setof nearfeature AS $$
55 DECLARE
56   r nearfeature%rowtype;
57 BEGIN
58
59 -- start
60   IF in_partition = '-partition-' THEN
61     FOR r IN 
62       SELECT place_id, keywords, rank_address, rank_search, ST_Distance(point, centroid) as distance FROM (
63         SELECT * FROM location_area_large_-partition- WHERE ST_Contains(geometry, point) and rank_search < maxrank
64         UNION ALL
65         SELECT * FROM location_area_country WHERE ST_Contains(geometry, point) and rank_search < maxrank
66       ) as location_area
67       ORDER BY rank_search desc, isin_tokens && keywords desc, isguess asc, rank_address asc, ST_Distance(point, centroid) ASC
68     LOOP
69       RETURN NEXT r;
70     END LOOP;
71     RETURN;
72   END IF;
73 -- end
74
75   RAISE EXCEPTION 'Unknown partition %', in_partition;
76 END
77 $$
78 LANGUAGE plpgsql;
79
80 create or replace function deleteLocationArea(in_partition TEXT, in_place_id bigint) RETURNS BOOLEAN AS $$
81 DECLARE
82 BEGIN
83
84 -- start
85   IF in_partition = '-partition-' THEN
86     DELETE from location_area_large_-partition- WHERE place_id = in_place_id;
87     DELETE from location_area_roadnear_-partition- WHERE place_id = in_place_id;
88     DELETE from location_area_roadfar_-partition- WHERE place_id = in_place_id;
89     RETURN TRUE;
90   END IF;
91 -- end
92
93   RAISE EXCEPTION 'Unknown partition %', in_partition;
94
95   RETURN FALSE;
96 END
97 $$
98 LANGUAGE plpgsql;
99
100 create or replace function insertLocationAreaLarge(
101   in_partition TEXT, in_place_id bigint, in_country_code VARCHAR(2), in_keywords INTEGER[], 
102   in_rank_search INTEGER, in_rank_address INTEGER, in_estimate BOOLEAN, 
103   in_centroid GEOMETRY, in_geometry GEOMETRY) RETURNS BOOLEAN AS $$
104 DECLARE
105 BEGIN
106
107   IF in_rank_search <= 4 THEN
108     INSERT INTO location_area_country values (in_partition, in_place_id, in_country_code, in_keywords, in_rank_search, in_rank_address, in_estimate, in_centroid, in_geometry);
109     RETURN TRUE;
110   END IF;
111
112 -- start
113   IF in_partition = '-partition-' THEN
114     INSERT INTO location_area_large_-partition- values (in_partition, in_place_id, in_country_code, in_keywords, in_rank_search, in_rank_address, in_estimate, in_centroid, in_geometry);
115     RETURN TRUE;
116   END IF;
117 -- end
118
119   RAISE EXCEPTION 'Unknown partition %', in_partition;
120   RETURN FALSE;
121 END
122 $$
123 LANGUAGE plpgsql;
124
125 create or replace function insertLocationAreaRoadNear(
126   in_partition TEXT, in_place_id bigint, in_country_code VARCHAR(2), in_keywords INTEGER[], 
127   in_rank_search INTEGER, in_rank_address INTEGER, in_estimate BOOLEAN, 
128   in_centroid GEOMETRY, in_geometry GEOMETRY) RETURNS BOOLEAN AS $$
129 DECLARE
130 BEGIN
131
132 -- start
133   IF in_partition = '-partition-' THEN
134     INSERT INTO location_area_roadnear_-partition- values (in_partition, in_place_id, in_country_code, in_keywords, in_rank_search, in_rank_address, in_estimate, in_centroid, in_geometry);
135     RETURN TRUE;
136   END IF;
137 -- end
138
139   RAISE EXCEPTION 'Unknown partition %', in_partition;
140   RETURN FALSE;
141 END
142 $$
143 LANGUAGE plpgsql;
144
145 create or replace function insertLocationAreaRoadFar(
146   in_partition TEXT, in_place_id bigint, in_country_code VARCHAR(2), in_keywords INTEGER[], 
147   in_rank_search INTEGER, in_rank_address INTEGER, in_estimate BOOLEAN, 
148   in_centroid GEOMETRY, in_geometry GEOMETRY) RETURNS BOOLEAN AS $$
149 DECLARE
150 BEGIN
151
152 -- start
153   IF in_partition = '-partition-' THEN
154     INSERT INTO location_area_roadfar_-partition- values (in_partition, in_place_id, in_country_code, in_keywords, in_rank_search, in_rank_address, in_estimate, in_centroid, in_geometry);
155     RETURN TRUE;
156   END IF;
157 -- end
158
159   RAISE EXCEPTION 'Unknown partition %', in_partition;
160   RETURN FALSE;
161 END
162 $$
163 LANGUAGE plpgsql;