-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathWikipedia-Trash.sql
67 lines (44 loc) · 2.22 KB
/
Wikipedia-Trash.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
-- Things I tried out, but caused bad query plans
----
CREATE INDEX idx_node_tags_wiki ON node_tags(lgd_encodeWikiTitle(v) text_pattern_ops) WHERE substring(k from 1 for 9) = 'wikipedia';
CREATE INDEX idx_way_tags_wiki ON way_tags(lgd_encodeWikiTitle(v) text_pattern_ops) WHERE substring(k from 1 for 9) = 'wikipedia';
CREATE INDEX idx_relation_tags_wiki ON relation_tags(lgd_encodeWikiTitle(v) text_pattern_ops) WHERE substring(k from 1 for 9) = 'wikipedia';
CREATE VIEW lgd_node_tags_wiki AS
SELECT t.node_id, t.k, lgd_encodeWikiTitle(t.v) v FROM node_tags t WHERE substring(k from 1 for 9) = 'wikipedia';
CREATE VIEW lgd_way_tags_wiki AS
SELECT t.way_id, t.k, lgd_encodeWikiTitle(t.v) v FROM way_tags t WHERE substring(k from 1 for 9) = 'wikipedia';
CREATE VIEW lgd_relation_tags_wiki AS
SELECT t.relation_id, t.k, lgd_encodeWikiTitle(t.v) v FROM relation_tags t WHERE substring(k from 1 for 9) = 'wikipedia';
----
DROP FUNCTION IF EXISTS lgd_tryEncodeWikiTitle(k TEXT, v TEXT);
CREATE FUNCTION lgd_tryEncodeWikiTitle(k TEXT, v TEXT) RETURNS text AS
$$
DECLARE
BEGIN
RETURN
CASE
WHEN (substring(k from 1 for 9) = 'wikipedia') THEN lgd_encodeWikiTitle(v)
ELSE NULL::text
END;
END;
$$
LANGUAGE 'plpgsql'
IMMUTABLE
RETURNS NULL ON NULL INPUT;
/**
FUCK: This approach gives:
lgd=# explain select * from lgd_relation_tags_wiki where v = 'wikipedia:en';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Index Scan using idx_relation_tags_wiki on relation_tags (cost=0.50..56952.04 rows=40464 width=29)
Index Cond: ((lgd_tryencodewikititle(k, v) IS NOT NULL) AND (lgd_tryencodewikititle(k, v) = 'wikipedia:en'::text))
It gives 40464 rows, where there should be *1*
*
*
*
*/
CREATE INDEX idx_relation_tags_wiki ON relation_tags(lgd_tryEncodeWikiTitle(k, v) text_pattern_ops) WHERE lgd_tryEncodeWikiTitle(k, v) IS NOT NULL;
CREATE VIEW lgd_relation_tags_wiki AS
SELECT relation_id, k, lgd_tryEncodeWikiTitle(k, v) v
FROM relation_tags
WHERE lgd_tryEncodeWikiTitle(k, v) IS NOT NULL;