Skip to content

Commit 3b798b5

Browse files
author
Adam Ever-Hadani
authored
Merge pull request #22 from RDFLib/feature/ah-cleanup-tables
Cleanup table creation
2 parents 4204845 + aaae816 commit 3b798b5

File tree

9 files changed

+345
-249
lines changed

9 files changed

+345
-249
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ env:
44
- DB=mysql
55
- DB=sqlite
66
python:
7-
- 2.6
87
- 2.7
98
- 3.3
109
- 3.4

rdflib_sqlalchemy/store.py

Lines changed: 78 additions & 192 deletions
Large diffs are not rendered by default.

rdflib_sqlalchemy/tables.py

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
from sqlalchemy import Column, Table, Index, types
2+
3+
from rdflib_sqlalchemy.types import TermType
4+
5+
6+
MYSQL_MAX_INDEX_LENGTH = 200
7+
8+
TABLE_NAME_TEMPLATES = [
9+
"{interned_id}_asserted_statements",
10+
"{interned_id}_literal_statements",
11+
"{interned_id}_namespace_binds",
12+
"{interned_id}_quoted_statements",
13+
"{interned_id}_type_statements",
14+
]
15+
16+
17+
def create_asserted_statements_table(interned_id, metadata):
18+
return Table(
19+
"{interned_id}_asserted_statements".format(interned_id=interned_id),
20+
metadata,
21+
Column("id", types.Integer, nullable=False, primary_key=True),
22+
Column("subject", TermType, nullable=False),
23+
Column("predicate", TermType, nullable=False),
24+
Column("object", TermType, nullable=False),
25+
Column("context", TermType, nullable=False),
26+
Column("termcomb", types.Integer, nullable=False, key="termComb"),
27+
Index(
28+
"{interned_id}_A_s_index".format(interned_id=interned_id),
29+
"subject",
30+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
31+
),
32+
Index(
33+
"{interned_id}_A_p_index".format(interned_id=interned_id),
34+
"predicate",
35+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
36+
),
37+
Index(
38+
"{interned_id}_A_o_index".format(interned_id=interned_id),
39+
"object",
40+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
41+
),
42+
Index(
43+
"{interned_id}_A_c_index".format(interned_id=interned_id),
44+
"context",
45+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
46+
),
47+
Index(
48+
"{interned_id}_A_termComb_index".format(interned_id=interned_id),
49+
"termComb",
50+
),
51+
Index(
52+
"{interned_id}_asserted_spoc_key".format(interned_id=interned_id),
53+
"subject",
54+
"predicate",
55+
"object",
56+
"context",
57+
unique=True,
58+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
59+
),
60+
)
61+
62+
63+
def create_type_statements_table(interned_id, metadata):
64+
return Table(
65+
"{interned_id}_type_statements".format(interned_id=interned_id),
66+
metadata,
67+
Column("id", types.Integer, nullable=False, primary_key=True),
68+
Column("member", TermType, nullable=False),
69+
Column("klass", TermType, nullable=False),
70+
Column("context", TermType, nullable=False),
71+
Column("termcomb", types.Integer, nullable=False, key="termComb"),
72+
Index(
73+
"{interned_id}_member_index".format(interned_id=interned_id),
74+
"member",
75+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
76+
),
77+
Index(
78+
"{interned_id}_klass_index".format(interned_id=interned_id),
79+
"klass",
80+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
81+
),
82+
Index(
83+
"{interned_id}_c_index".format(interned_id=interned_id),
84+
"context",
85+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
86+
),
87+
Index(
88+
"{interned_id}_T_termComb_index".format(interned_id=interned_id),
89+
"termComb",
90+
),
91+
Index(
92+
"{interned_id}_type_mkc_key".format(interned_id=interned_id),
93+
"member",
94+
"klass",
95+
"context",
96+
unique=True,
97+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
98+
),
99+
)
100+
101+
102+
def create_literal_statements_table(interned_id, metadata):
103+
return Table(
104+
"{interned_id}_literal_statements".format(interned_id=interned_id),
105+
metadata,
106+
Column("id", types.Integer, nullable=False, primary_key=True),
107+
Column("subject", TermType, nullable=False),
108+
Column("predicate", TermType, nullable=False),
109+
Column("object", TermType),
110+
Column("context", TermType, nullable=False),
111+
Column("termcomb", types.Integer, nullable=False, key="termComb"),
112+
Column("objlanguage", types.String(255), key="objLanguage"),
113+
Column("objdatatype", types.String(255), key="objDatatype"),
114+
Index(
115+
"{interned_id}_L_s_index".format(interned_id=interned_id),
116+
"subject",
117+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
118+
),
119+
Index(
120+
"{interned_id}_L_p_index".format(interned_id=interned_id),
121+
"predicate",
122+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
123+
),
124+
Index(
125+
"{interned_id}_L_c_index".format(interned_id=interned_id),
126+
"context",
127+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
128+
),
129+
Index(
130+
"{interned_id}_L_termComb_index".format(interned_id=interned_id),
131+
"termComb",
132+
),
133+
Index(
134+
"{interned_id}_literal_spoc_key".format(interned_id=interned_id),
135+
"subject",
136+
"predicate",
137+
"object",
138+
"context",
139+
unique=True,
140+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
141+
),
142+
)
143+
144+
145+
def create_quoted_statements_table(interned_id, metadata):
146+
return Table(
147+
"{interned_id}_quoted_statements".format(interned_id=interned_id),
148+
metadata,
149+
Column("id", types.Integer, nullable=False, primary_key=True),
150+
Column("subject", TermType, nullable=False),
151+
Column("predicate", TermType, nullable=False),
152+
Column("object", TermType),
153+
Column("context", TermType, nullable=False),
154+
Column("termcomb", types.Integer, nullable=False, key="termComb"),
155+
Column("objlanguage", types.String(255), key="objLanguage"),
156+
Column("objdatatype", types.String(255), key="objDatatype"),
157+
Index(
158+
"{interned_id}_Q_s_index".format(interned_id=interned_id),
159+
"subject",
160+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
161+
),
162+
Index(
163+
"{interned_id}_Q_p_index".format(interned_id=interned_id),
164+
"predicate",
165+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
166+
),
167+
Index(
168+
"{interned_id}_Q_o_index".format(interned_id=interned_id),
169+
"object",
170+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
171+
),
172+
Index(
173+
"{interned_id}_Q_c_index".format(interned_id=interned_id),
174+
"context",
175+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
176+
),
177+
Index(
178+
"{interned_id}_Q_termComb_index".format(interned_id=interned_id),
179+
"termComb",
180+
),
181+
Index(
182+
"{interned_id}_quoted_spoc_key".format(interned_id=interned_id),
183+
"subject",
184+
"predicate",
185+
"object",
186+
"context",
187+
unique=True,
188+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
189+
),
190+
)
191+
192+
193+
def create_namespace_binds_table(interned_id, metadata):
194+
return Table(
195+
"{interned_id}_namespace_binds".format(interned_id=interned_id),
196+
metadata,
197+
Column("prefix", types.String(20), unique=True, nullable=False, primary_key=True),
198+
Column("uri", types.Text),
199+
Index(
200+
"{interned_id}_uri_index".format(interned_id=interned_id),
201+
"uri",
202+
mysql_length=MYSQL_MAX_INDEX_LENGTH,
203+
)
204+
)

rdflib_sqlalchemy/termutils.py

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,12 @@
99
from rdflib.term import Statement
1010

1111

12-
__all__ = ["SUBJECT", "PREDICATE", "OBJECT", "CONTEXT", "TERM_COMBINATIONS",
13-
"REVERSE_TERM_COMBINATIONS", "TERM_INSTANTIATION_DICT",
14-
"GRAPH_TERM_DICT", "normalizeGraph", "term2Letter",
15-
"constructGraph", "triplePattern2termCombinations",
16-
"type2TermCombination", "statement2TermCombination",
17-
"escape_quotes"]
18-
1912
SUBJECT = 0
2013
PREDICATE = 1
2114
OBJECT = 2
2215
CONTEXT = 3
23-
TERM_COMBINATIONS = dict([(term, index) for index, term, in enumerate([
16+
17+
TERM_COMBINATIONS = dict([(term, index) for index, term in enumerate([
2418
"UUUU", "UUUB", "UUUF", "UUVU", "UUVB", "UUVF", "UUBU", "UUBB", "UUBF",
2519
"UULU", "UULB", "UULF", "UUFU", "UUFB", "UUFF",
2620
#
@@ -70,7 +64,7 @@
7064

7165

7266
@format_doctest_out
73-
def normalizeGraph(graph):
67+
def normalize_graph(graph):
7468
"""
7569
Take an instance of a ``Graph`` and return the instance's identifier and ``type``.
7670
@@ -82,27 +76,27 @@ def normalizeGraph(graph):
8276
>>> from rdflib.graph import Graph, ConjunctiveGraph, QuotedGraph
8377
>>> from rdflib.store import Store
8478
>>> from rdflib import URIRef, Namespace
85-
>>> from rdflib_sqlalchemy.termutils import normalizeGraph
79+
>>> from rdflib_sqlalchemy.termutils import normalize_graph
8680
>>> memstore = plugin.get('IOMemory', Store)()
8781
>>> g = Graph(memstore, URIRef("http://purl.org/net/bel-epa/gjh"))
88-
>>> normalizeGraph(g)
82+
>>> normalize_graph(g)
8983
(rdflib.term.URIRef(%(u)s'http://purl.org/net/bel-epa/gjh'), 'U')
9084
>>> g = ConjunctiveGraph(memstore, Namespace("http://rdflib.net/ns"))
91-
>>> normalizeGraph(g) #doctest: +ELLIPSIS
85+
>>> normalize_graph(g) #doctest: +ELLIPSIS
9286
(rdflib.term.URIRef(%(u)s'http://rdflib.net/ns'), 'U')
9387
>>> g = QuotedGraph(memstore, Namespace("http://rdflib.net/ns"))
94-
>>> normalizeGraph(g)
88+
>>> normalize_graph(g)
9589
(rdflib.term.URIRef(%(u)s'http://rdflib.net/ns'), 'F')
9690
9791
"""
9892
if isinstance(graph, QuotedGraph):
9993
return graph.identifier, "F"
10094
else:
101-
return graph.identifier, term2Letter(graph.identifier)
95+
return graph.identifier, term_to_letter(graph.identifier)
10296

10397

10498
@format_doctest_out
105-
def term2Letter(term):
99+
def term_to_letter(term):
106100
"""
107101
Relate a given term to one of several key types.
108102
@@ -118,22 +112,22 @@ def term2Letter(term):
118112
>>> from rdflib.term import BNode
119113
>>> # from rdflib.term import Statement
120114
>>> from rdflib.graph import Graph, QuotedGraph
121-
>>> from rdflib_sqlalchemy.termutils import term2Letter
122-
>>> term2Letter(URIRef('http://purl.org/net/bel-epa.com/'))
115+
>>> from rdflib_sqlalchemy.termutils import term_to_letter
116+
>>> term_to_letter(URIRef('http://purl.org/net/bel-epa.com/'))
123117
'U'
124-
>>> term2Letter(BNode())
118+
>>> term_to_letter(BNode())
125119
'B'
126-
>>> term2Letter(Literal(%(u)s'')) # noqa
120+
>>> term_to_letter(Literal(%(u)s'')) # noqa
127121
'L'
128-
>>> term2Letter(Variable(%(u)s'x')) # noqa
122+
>>> term_to_letter(Variable(%(u)s'x')) # noqa
129123
'V'
130-
>>> term2Letter(Graph())
124+
>>> term_to_letter(Graph())
131125
'B'
132-
>>> term2Letter(QuotedGraph("IOMemory", None))
126+
>>> term_to_letter(QuotedGraph("IOMemory", None))
133127
'F'
134-
>>> term2Letter(None)
128+
>>> term_to_letter(None)
135129
'L'
136-
>>> # term2Letter(Statement((None, None, None), None)) # Deprecated
130+
>>> # term_to_letter(Statement((None, None, None), None)) # Deprecated
137131
138132
"""
139133
if isinstance(term, URIRef):
@@ -149,7 +143,7 @@ def term2Letter(term):
149143
elif isinstance(term, Statement):
150144
return "s"
151145
elif isinstance(term, Graph):
152-
return term2Letter(term.identifier)
146+
return term_to_letter(term.identifier)
153147
elif term is None:
154148
return "L"
155149
else:
@@ -160,55 +154,54 @@ def term2Letter(term):
160154
% (term, type(term)))
161155

162156

163-
def constructGraph(key):
157+
def construct_graph(key):
164158
"""
165159
Return a tuple containing a ``Graph`` and an appropriate referent.
166160
167161
Takes a key (one of 'F', 'U' or 'B')
168162
169-
>>> from rdflib_sqlalchemy.termutils import constructGraph
170-
>>> constructGraph('F')
163+
>>> from rdflib_sqlalchemy.termutils import construct_graph
164+
>>> construct_graph('F')
171165
(<class 'rdflib.graph.QuotedGraph'>, <class 'rdflib.term.URIRef'>)
172-
>>> constructGraph('U')
166+
>>> construct_graph('U')
173167
(<class 'rdflib.graph.Graph'>, <class 'rdflib.term.URIRef'>)
174-
>>> constructGraph('B')
168+
>>> construct_graph('B')
175169
(<class 'rdflib.graph.Graph'>, <class 'rdflib.term.BNode'>)
176170
177171
"""
178172
return GRAPH_TERM_DICT[key]
179173

180174

181-
def triplePattern2termCombinations(triple):
175+
def triple_pattern_to_term_combinations(triple):
182176
"""Map a triple pattern to term combinations (non-functioning)."""
183177
s, p, o = triple
184178
combinations = []
185-
# combinations.update(TERM_COMBINATIONS)
186179
if isinstance(o, Literal):
187180
for key, val in TERM_COMBINATIONS.items():
188181
if key[OBJECT] == 'O':
189182
combinations.append(val)
190183
return combinations
191184

192185

193-
def type2TermCombination(member, klass, context):
194-
"""Map a type to a TermCombo."""
186+
def type_to_term_combination(member, klass, context):
187+
"""Map a type to a term combination."""
195188
try:
196189
rt = TERM_COMBINATIONS["%sU%s%s" %
197-
(term2Letter(member),
198-
term2Letter(klass),
199-
normalizeGraph(context)[-1])]
190+
(term_to_letter(member),
191+
term_to_letter(klass),
192+
normalize_graph(context)[-1])]
200193
return rt
201194
except:
202195
raise Exception("Unable to persist" +
203196
"classification triple: %s %s %s %s" %
204197
(member, "rdf:type", klass, context))
205198

206199

207-
def statement2TermCombination(subject, predicate, obj, context):
200+
def statement_to_term_combination(subject, predicate, obj, context):
208201
"""Map a statement to a Term Combo."""
209202
return TERM_COMBINATIONS["%s%s%s%s" %
210-
(term2Letter(subject), term2Letter(predicate),
211-
term2Letter(obj), normalizeGraph(context)[-1])]
203+
(term_to_letter(subject), term_to_letter(predicate),
204+
term_to_letter(obj), normalize_graph(context)[-1])]
212205

213206

214207
def escape_quotes(qstr):

0 commit comments

Comments
 (0)