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