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