|
1 | 1 | """SQLAlchemy-based RDF store."""
|
2 |
| -from __future__ import with_statement |
3 |
| - |
4 | 2 | import hashlib
|
5 | 3 | import logging
|
6 | 4 |
|
|
19 | 17 | from six.moves import reduce
|
20 | 18 | from sqlalchemy import MetaData
|
21 | 19 | from sqlalchemy.engine import reflection
|
22 |
| -from sqlalchemy.sql import select, expression |
| 20 | +from sqlalchemy.sql import expression, select |
23 | 21 |
|
24 | 22 | from rdflib_sqlalchemy.constants import (
|
25 |
| - CONTEXT_SELECT, |
26 |
| - COUNT_SELECT, |
27 |
| - INTERNED_PREFIX, |
28 | 23 | ASSERTED_LITERAL_PARTITION,
|
29 | 24 | ASSERTED_NON_TYPE_PARTITION,
|
30 | 25 | ASSERTED_TYPE_PARTITION,
|
| 26 | + CONTEXT_SELECT, |
| 27 | + COUNT_SELECT, |
| 28 | + INTERNED_PREFIX, |
31 | 29 | QUOTED_PARTITION,
|
32 | 30 | TRIPLE_SELECT_NO_ORDER,
|
33 | 31 | )
|
34 | 32 | from rdflib_sqlalchemy.tables import (
|
35 |
| - get_table_names, |
36 | 33 | create_asserted_statements_table,
|
37 | 34 | create_literal_statements_table,
|
38 | 35 | create_namespace_binds_table,
|
39 | 36 | create_quoted_statements_table,
|
40 | 37 | create_type_statements_table,
|
| 38 | + get_table_names, |
41 | 39 | )
|
42 |
| -from rdflib_sqlalchemy.base import SQLGenerator |
43 |
| -from rdflib_sqlalchemy.termutils import extract_triple |
| 40 | +from rdflib_sqlalchemy.base import SQLGeneratorMixin |
44 | 41 | from rdflib_sqlalchemy.sql import union_select
|
| 42 | +from rdflib_sqlalchemy.statistics import StatisticsMixin |
| 43 | +from rdflib_sqlalchemy.termutils import extract_triple |
45 | 44 |
|
46 | 45 |
|
47 | 46 | _logger = logging.getLogger(__name__)
|
48 | 47 |
|
49 | 48 | Any = None
|
50 | 49 |
|
51 | 50 |
|
52 |
| -class SQLAlchemy(Store, SQLGenerator): |
| 51 | +class SQLAlchemy(Store, SQLGeneratorMixin, StatisticsMixin): |
53 | 52 | """
|
54 | 53 | SQL-92 formula-aware implementation of an rdflib Store.
|
55 | 54 |
|
@@ -124,14 +123,11 @@ def __repr__(self):
|
124 | 123 | literal_table = self.tables["literal_statements"]
|
125 | 124 |
|
126 | 125 | selects = [
|
127 |
| - (expression.alias(asserted_type_table, "typetable"), |
128 |
| - None, ASSERTED_TYPE_PARTITION), |
129 |
| - (expression.alias(quoted_table, "quoted"), |
130 |
| - None, QUOTED_PARTITION), |
131 |
| - (expression.alias(asserted_table, "asserted"), |
132 |
| - None, ASSERTED_NON_TYPE_PARTITION), |
133 |
| - (expression.alias(literal_table, "literal"), |
134 |
| - None, ASSERTED_LITERAL_PARTITION), ] |
| 126 | + (expression.alias(asserted_type_table, "typetable"), None, ASSERTED_TYPE_PARTITION), |
| 127 | + (expression.alias(quoted_table, "quoted"), None, QUOTED_PARTITION), |
| 128 | + (expression.alias(asserted_table, "asserted"), None, ASSERTED_NON_TYPE_PARTITION), |
| 129 | + (expression.alias(literal_table, "literal"), None, ASSERTED_LITERAL_PARTITION), |
| 130 | + ] |
135 | 131 | q = union_select(selects, distinct=False, select_type=COUNT_SELECT)
|
136 | 132 | if hasattr(self, "engine"):
|
137 | 133 | with self.engine.connect() as connection:
|
@@ -678,6 +674,8 @@ def namespaces(self):
|
678 | 674 | for prefix, uri in res.fetchall():
|
679 | 675 | yield prefix, uri
|
680 | 676 |
|
| 677 | + # Private methods |
| 678 | + |
681 | 679 | def _create_table_definitions(self):
|
682 | 680 | self.metadata = MetaData()
|
683 | 681 | self.tables = {
|
|
0 commit comments