Skip to content

Commit 71be4b5

Browse files
committed
more cleanup
1 parent 24ee4c6 commit 71be4b5

File tree

5 files changed

+470
-493
lines changed

5 files changed

+470
-493
lines changed

rdflib_sqlalchemy/constants.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""Constant definitions"""
2+
from rdflib import BNode, Literal, URIRef, Variable
3+
4+
5+
COUNT_SELECT = 0
6+
CONTEXT_SELECT = 1
7+
TRIPLE_SELECT = 2
8+
TRIPLE_SELECT_NO_ORDER = 3
9+
10+
ASSERTED_NON_TYPE_PARTITION = 3
11+
ASSERTED_TYPE_PARTITION = 4
12+
QUOTED_PARTITION = 5
13+
ASSERTED_LITERAL_PARTITION = 6
14+
15+
FULL_TRIPLE_PARTITIONS = [QUOTED_PARTITION, ASSERTED_LITERAL_PARTITION]
16+
17+
INTERNED_PREFIX = "kb_"
18+
19+
TERM_COMBINATIONS = dict([(term, index) for index, term in enumerate([
20+
"UUUU", "UUUB", "UUUF", "UUVU", "UUVB", "UUVF", "UUBU", "UUBB", "UUBF",
21+
"UULU", "UULB", "UULF", "UUFU", "UUFB", "UUFF",
22+
#
23+
"UVUU", "UVUB", "UVUF", "UVVU", "UVVB", "UVVF", "UVBU", "UVBB", "UVBF",
24+
"UVLU", "UVLB", "UVLF", "UVFU", "UVFB", "UVFF",
25+
#
26+
"VUUU", "VUUB", "VUUF", "VUVU", "VUVB", "VUVF", "VUBU", "VUBB", "VUBF",
27+
"VULU", "VULB", "VULF", "VUFU", "VUFB", "VUFF",
28+
#
29+
"VVUU", "VVUB", "VVUF", "VVVU", "VVVB", "VVVF", "VVBU", "VVBB", "VVBF",
30+
"VVLU", "VVLB", "VVLF", "VVFU", "VVFB", "VVFF",
31+
#
32+
"BUUU", "BUUB", "BUUF", "BUVU", "BUVB", "BUVF", "BUBU", "BUBB", "BUBF",
33+
"BULU", "BULB", "BULF", "BUFU", "BUFB", "BUFF",
34+
#
35+
"BVUU", "BVUB", "BVUF", "BVVU", "BVVB", "BVVF", "BVBU", "BVBB", "BVBF",
36+
"BVLU", "BVLB", "BVLF", "BVFU", "BVFB", "BVFF",
37+
#
38+
"FUUU", "FUUB", "FUUF", "FUVU", "FUVB", "FUVF", "FUBU", "FUBB", "FUBF",
39+
"FULU", "FULB", "FULF", "FUFU", "FUFB", "FUFF",
40+
#
41+
"FVUU", "FVUB", "FVUF", "FVVU", "FVVB", "FVVF", "FVBU", "FVBB", "FVBF",
42+
"FVLU", "FVLB", "FVLF", "FVFU", "FVFB", "FVFF",
43+
])])
44+
45+
REVERSE_TERM_COMBINATIONS = dict([
46+
(value, key)
47+
for key, value in TERM_COMBINATIONS.items()
48+
])
49+
50+
TERM_INSTANTIATION_DICT = {
51+
"U": URIRef,
52+
"B": BNode,
53+
"V": Variable,
54+
"L": Literal
55+
}

rdflib_sqlalchemy/sql.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
from rdflib.namespace import RDF
2+
from six import text_type
3+
from sqlalchemy.sql import expression
4+
5+
from rdflib_sqlalchemy.constants import (
6+
ASSERTED_TYPE_PARTITION,
7+
ASSERTED_NON_TYPE_PARTITION,
8+
CONTEXT_SELECT,
9+
COUNT_SELECT,
10+
FULL_TRIPLE_PARTITIONS,
11+
TRIPLE_SELECT,
12+
)
13+
14+
15+
def query_analysis(query, store, connection):
16+
"""
17+
Helper function.
18+
19+
For executing EXPLAIN on all dispatched SQL statements -
20+
for the pupose of analyzing index usage.
21+
22+
"""
23+
res = connection.execute("explain " + query)
24+
rt = res.fetchall()[0]
25+
table, joinType, posKeys, _key, key_len, \
26+
comparedCol, rowsExamined, extra = rt
27+
if not _key:
28+
assert joinType == "ALL"
29+
if not hasattr(store, "queryOptMarks"):
30+
store.queryOptMarks = {}
31+
hits = store.queryOptMarks.get(("FULL SCAN", table), 0)
32+
store.queryOptMarks[("FULL SCAN", table)] = hits + 1
33+
34+
if not hasattr(store, "queryOptMarks"):
35+
store.queryOptMarks = {}
36+
hits = store.queryOptMarks.get((_key, table), 0)
37+
store.queryOptMarks[(_key, table)] = hits + 1
38+
39+
40+
def union_select(selectComponents, distinct=False, select_type=TRIPLE_SELECT):
41+
"""
42+
Helper function for building union all select statement.
43+
44+
Terms: u - uri refs v - variables b - bnodes l - literal f - formula
45+
46+
Takes a list of:
47+
- table name
48+
- table alias
49+
- table type (literal, type, asserted, quoted)
50+
- where clause string
51+
"""
52+
selects = []
53+
for table, whereClause, tableType in selectComponents:
54+
55+
if select_type == COUNT_SELECT:
56+
selectClause = table.count(whereClause)
57+
elif select_type == CONTEXT_SELECT:
58+
selectClause = expression.select([table.c.context], whereClause)
59+
elif tableType in FULL_TRIPLE_PARTITIONS:
60+
selectClause = table.select(whereClause)
61+
elif tableType == ASSERTED_TYPE_PARTITION:
62+
selectClause = expression.select(
63+
[table.c.id.label("id"),
64+
table.c.member.label("subject"),
65+
expression.literal(text_type(RDF.type)).label("predicate"),
66+
table.c.klass.label("object"),
67+
table.c.context.label("context"),
68+
table.c.termComb.label("termcomb"),
69+
expression.literal_column("NULL").label("objlanguage"),
70+
expression.literal_column("NULL").label("objdatatype")],
71+
whereClause)
72+
elif tableType == ASSERTED_NON_TYPE_PARTITION:
73+
selectClause = expression.select(
74+
[c for c in table.columns] +
75+
[expression.literal_column("NULL").label("objlanguage"),
76+
expression.literal_column("NULL").label("objdatatype")],
77+
whereClause,
78+
from_obj=[table])
79+
80+
selects.append(selectClause)
81+
82+
order_statement = []
83+
if select_type == TRIPLE_SELECT:
84+
order_statement = [
85+
expression.literal_column("subject"),
86+
expression.literal_column("predicate"),
87+
expression.literal_column("object"),
88+
]
89+
if distinct:
90+
return expression.union(*selects, **{"order_by": order_statement})
91+
else:
92+
return expression.union_all(*selects, **{"order_by": order_statement})

0 commit comments

Comments
 (0)