home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyc (Python 2.6) from __future__ import generators from rdflib import BNode from rdflib.Literal import Literal from pprint import pprint from pysqlite2 import dbapi2 import sha import sys import re import os from rdflib.term_utils import * from rdflib.Graph import QuotedGraph from rdflib.store.REGEXMatching import REGEXTerm, NATIVE_REGEX, PYTHON_REGEX from rdflib.store.AbstractSQLStore import * Any = None def regexp(expr, item): r = re.compile(expr) return r.match(item) is not None class SQLite(AbstractSQLStore): """ SQLite store formula-aware implementation. It stores it's triples in the following partitions: - Asserted non rdf:type statements - Asserted rdf:type statements (in a table which models Class membership) The motivation for this partition is primarily query speed and scalability as most graphs will always have more rdf:type statements than others - All Quoted statements In addition it persists namespace mappings in a seperate table """ context_aware = True formula_aware = True transaction_aware = True regex_matching = PYTHON_REGEX autocommit_default = False def open(self, home, create = True): ''' Opens the store specified by the configuration string. If create is True a store will be created if it does not already exist. If create is False and a store does not already exist an exception is raised. An exception is also raised if a store exists, but there is insufficient permissions to open the store.''' if create: db = dbapi2.connect(os.path.join(home, self.identifier)) c = db.cursor() c.execute(CREATE_ASSERTED_STATEMENTS_TABLE % self._internedId) c.execute(CREATE_ASSERTED_TYPE_STATEMENTS_TABLE % self._internedId) c.execute(CREATE_QUOTED_STATEMENTS_TABLE % self._internedId) c.execute(CREATE_NS_BINDS_TABLE % self._internedId) c.execute(CREATE_LITERAL_STATEMENTS_TABLE % self._internedId) for tblName, indices in [ ('%s_asserted_statements', [ ('%s_A_termComb_index', ('termComb',)), ('%s_A_s_index', ('subject',)), ('%s_A_p_index', ('predicate',)), ('%s_A_o_index', ('object',)), ('%s_A_c_index', ('context',))]), ('%s_type_statements', [ ('%s_T_termComb_index', ('termComb',)), ('%s_member_index', ('member',)), ('%s_klass_index', ('klass',)), ('%s_c_index', ('context',))]), ('%s_literal_statements', [ ('%s_L_termComb_index', ('termComb',)), ('%s_L_s_index', ('subject',)), ('%s_L_p_index', ('predicate',)), ('%s_L_c_index', ('context',))]), ('%s_quoted_statements', [ ('%s_Q_termComb_index', ('termComb',)), ('%s_Q_s_index', ('subject',)), ('%s_Q_p_index', ('predicate',)), ('%s_Q_o_index', ('object',)), ('%s_Q_c_index', ('context',))]), ('%s_namespace_binds', [ ('%s_uri_index', ('uri',))])]: for indexName, columns in indices: c.execute('CREATE INDEX %s on %s (%s)' % (indexName % self._internedId, tblName % self._internedId, ','.join(columns))) c.close() db.commit() db.close() self._db = dbapi2.connect(os.path.join(home, self.identifier)) self._db.create_function('regexp', 2, regexp) if os.path.exists(os.path.join(home, self.identifier)): c = self._db.cursor() c.execute("SELECT * FROM sqlite_master WHERE type='table'") tbls = [ rt[1] for rt in c.fetchall() ] c.close() for tbl in table_name_prefixes: pass return 1 def destroy(self, home): ''' FIXME: Add documentation ''' db = dbapi2.connect(os.path.join(home, self.identifier)) c = db.cursor() for tblsuffix in table_name_prefixes: try: c.execute('DROP table %s' % tblsuffix % self._internedId) continue print 'unable to drop table: %s' % tblsuffix % self._internedId continue print 'Destroyed Close World Universe %s ( in SQLite database %s)' % (self.identifier, home) db.commit() c.close() db.close() os.remove(os.path.join(home, self.identifier)) def EscapeQuotes(self, qstr): ''' Ported from Ft.Lib.DbUtil ''' if qstr is None: return '' tmp = qstr.replace('\\', '\\\\') tmp = tmp.replace('"', '""') tmp = tmp.replace("'", "\\'") return tmp def normalizeTerm(self, term): if isinstance(term, (QuotedGraph, Graph)): return term.identifier if isinstance(term, Literal): return self.EscapeQuotes(term) if term is None or isinstance(term, (list, REGEXTerm)): return term return term def buildSubjClause(self, subject, tableName): if isinstance(subject, REGEXTerm): if not tableName or '%s.subject' % tableName: pass return (' REGEXP (%s,' + ' %s)' % 'subject', [ subject]) if isinstance(subject, list): clauseStrings = [] paramStrings = [] for s in subject: if isinstance(s, REGEXTerm): if not tableName or '%s.subject' % tableName: pass clauseStrings.append(' REGEXP (%s,' + ' %s)' % 'subject' + ' %s') paramStrings.append(self.normalizeTerm(s)) continue isinstance(subject, REGEXTerm) if isinstance(s, (QuotedGraph, Graph)): if not tableName or '%s.subject' % tableName: pass clauseStrings.append('%s=' % 'subject' + '%s') paramStrings.append(self.normalizeTerm(s.identifier)) continue if not tableName or '%s.subject' % tableName: pass clauseStrings.append('%s=' % 'subject' + '%s') paramStrings.append(self.normalizeTerm(s)) return ('(' + ' or '.join(clauseStrings) + ')', paramStrings) if isinstance(subject, (QuotedGraph, Graph)): if not tableName or '%s.subject' % tableName: pass return ('%s=' % 'subject' + '%s', [ self.normalizeTerm(subject.identifier)]) if subject is not None: if not tableName or '%s.subject' % tableName: pass if not [ subject]: pass return ('%s=' % 'subject' + '%s', None) def buildPredClause(self, predicate, tableName): if isinstance(predicate, REGEXTerm): if not tableName or '%s.predicate' % tableName: pass return (' REGEXP (%s,' + ' %s)' % 'predicate', [ predicate]) if isinstance(predicate, list): clauseStrings = [] paramStrings = [] for p in predicate: if isinstance(p, REGEXTerm): if not tableName or '%s.predicate' % tableName: pass clauseStrings.append(' REGEXP (%s,' + ' %s)' % 'predicate') elif not tableName or '%s.predicate' % tableName: pass clauseStrings.append('%s=' % 'predicate' + '%s') paramStrings.append(self.normalizeTerm(p)) return ('(' + ' or '.join(clauseStrings) + ')', paramStrings) if predicate is not None: if not tableName or '%s.predicate' % tableName: pass if not [ predicate]: pass return ('%s=' % 'predicate' + '%s', None) def buildObjClause(self, obj, tableName): if isinstance(obj, REGEXTerm): if not tableName or '%s.object' % tableName: pass return (' REGEXP (%s,' + ' %s)' % 'object', [ obj]) if isinstance(obj, list): clauseStrings = [] paramStrings = [] for o in obj: if isinstance(o, REGEXTerm): if not tableName or '%s.object' % tableName: pass clauseStrings.append(' REGEXP (%s,' + ' %s)' % 'object') paramStrings.append(self.normalizeTerm(o)) continue isinstance(obj, REGEXTerm) if isinstance(o, (QuotedGraph, Graph)): if not tableName or '%s.object' % tableName: pass clauseStrings.append('%s=' % 'object' + '%s') paramStrings.append(self.normalizeTerm(o.identifier)) continue if not tableName or '%s.object' % tableName: pass clauseStrings.append('%s=' % 'object' + '%s') paramStrings.append(self.normalizeTerm(o)) return ('(' + ' or '.join(clauseStrings) + ')', paramStrings) if isinstance(obj, (QuotedGraph, Graph)): if not tableName or '%s.object' % tableName: pass return ('%s=' % 'object' + '%s', [ self.normalizeTerm(obj.identifier)]) if obj is not None: if not tableName or '%s.object' % tableName: pass if not [ obj]: pass return ('%s=' % 'object' + '%s', None) def buildContextClause(self, context, tableName): if not context is not None or self.normalizeTerm(context.identifier): pass context = context if isinstance(context, REGEXTerm): if not tableName or '%s.context' % tableName: pass return (' REGEXP (%s,' + ' %s)' % 'context', [ context]) if context is not None: if not tableName or '%s.context' % tableName: pass if not [ context]: pass return ('%s=' % 'context' + '%s', None) def buildTypeMemberClause(self, subject, tableName): if isinstance(subject, REGEXTerm): if not tableName or '%s.member' % tableName: pass return (' REGEXP (%s,' + ' %s)' % 'member', [ subject]) if isinstance(subject, list): clauseStrings = [] paramStrings = [] for s in subject: clauseStrings.append('%s.member=' % tableName + '%s') if isinstance(s, (QuotedGraph, Graph)): paramStrings.append(self.normalizeTerm(s.identifier)) continue isinstance(subject, REGEXTerm) paramStrings.append(self.normalizeTerm(s)) return ('(' + ' or '.join(clauseStrings) + ')', paramStrings) if subject: pass return (u'%s.member = ' % tableName + '%s', [ subject]) def buildTypeClassClause(self, obj, tableName): if isinstance(obj, REGEXTerm): if not tableName or '%s.klass' % tableName: pass return (' REGEXP (%s,' + ' %s)' % 'klass', [ obj]) if isinstance(obj, list): clauseStrings = [] paramStrings = [] for o in obj: clauseStrings.append('%s.klass=' % tableName + '%s') if isinstance(o, (QuotedGraph, Graph)): paramStrings.append(self.normalizeTerm(o.identifier)) continue isinstance(obj, REGEXTerm) paramStrings.append(self.normalizeTerm(o)) return ('(' + ' or '.join(clauseStrings) + ')', paramStrings) if obj is not None: pass if not [ obj]: pass return ('%s.klass = ' % tableName + '%s', None) def triples(self, .1, context = None): ''' A generator over all the triples matching pattern. Pattern can be any objects for comparing against nodes in the store, for example, RegExLiteral, Date? DateRange? quoted table: <id>_quoted_statements asserted rdf:type table: <id>_type_statements asserted non rdf:type table: <id>_asserted_statements triple columns: subject,predicate,object,context,termComb,objLanguage,objDatatype class membership columns: member,klass,context termComb FIXME: These union all selects *may* be further optimized by joins ''' (subject, predicate, obj) = .1 quoted_table = '%s_quoted_statements' % self._internedId asserted_table = '%s_asserted_statements' % self._internedId asserted_type_table = '%s_type_statements' % self._internedId literal_table = '%s_literal_statements' % self._internedId c = self._db.cursor() parameters = [] if predicate == RDF.type: (clauseString, params) = self.buildClause('typeTable', subject, RDF.type, obj, context, True) parameters.extend(params) selects = [ (asserted_type_table, 'typeTable', clauseString, ASSERTED_TYPE_PARTITION)] elif isinstance(predicate, REGEXTerm) or predicate.compiledExpr.match(RDF.type) or not predicate: selects = [] if (not (self.STRONGLY_TYPED_TERMS) and isinstance(obj, Literal) and not obj or self.STRONGLY_TYPED_TERMS) and isinstance(obj, REGEXTerm): (clauseString, params) = self.buildClause('literal', subject, predicate, obj, context) parameters.extend(params) selects.append((literal_table, 'literal', clauseString, ASSERTED_LITERAL_PARTITION)) if not isinstance(obj, Literal): if isinstance(obj, REGEXTerm): pass if not (self.STRONGLY_TYPED_TERMS) or not obj: (clauseString, params) = self.buildClause('asserted', subject, predicate, obj, context) parameters.extend(params) selects.append((asserted_table, 'asserted', clauseString, ASSERTED_NON_TYPE_PARTITION)) (clauseString, params) = self.buildClause('typeTable', subject, RDF.type, obj, context, True) parameters.extend(params) selects.append((asserted_type_table, 'typeTable', clauseString, ASSERTED_TYPE_PARTITION)) elif predicate: selects = [] if (not (self.STRONGLY_TYPED_TERMS) and isinstance(obj, Literal) and not obj or self.STRONGLY_TYPED_TERMS) and isinstance(obj, REGEXTerm): (clauseString, params) = self.buildClause('literal', subject, predicate, obj, context) parameters.extend(params) selects.append((literal_table, 'literal', clauseString, ASSERTED_LITERAL_PARTITION)) if not isinstance(obj, Literal): if isinstance(obj, REGEXTerm): pass if not (self.STRONGLY_TYPED_TERMS) or not obj: (clauseString, params) = self.buildClause('asserted', subject, predicate, obj, context) parameters.extend(params) selects.append((asserted_table, 'asserted', clauseString, ASSERTED_NON_TYPE_PARTITION)) if context is not None: (clauseString, params) = self.buildClause('quoted', subject, predicate, obj, context) parameters.extend(params) selects.append((quoted_table, 'quoted', clauseString, QUOTED_PARTITION)) q = self._normalizeSQLCmd(unionSELECT(selects, selectType = TRIPLE_SELECT_NO_ORDER)) self.executeSQL(c, q, parameters) tripleCoverage = { } result = c.fetchall() c.close() for rt in result: (graphKlass, idKlass, graphId) = (s, p, o) contexts = tripleCoverage.get((s, p, o), []) contexts.append(graphKlass(self, idKlass(graphId))) tripleCoverage[(s, p, o)] = contexts for s, p, o in tripleCoverage.items(): contexts = None yield ((s, p, o), (lambda .0: for c in .0: c)(contexts)) extractTriple(rt, self, context) CREATE_ASSERTED_STATEMENTS_TABLE = '\nCREATE TABLE %s_asserted_statements (\n subject text not NULL,\n predicate text not NULL,\n object text not NULL,\n context text not NULL,\n termComb tinyint unsigned not NULL)' CREATE_ASSERTED_TYPE_STATEMENTS_TABLE = '\nCREATE TABLE %s_type_statements (\n member text not NULL,\n klass text not NULL,\n context text not NULL,\n termComb tinyint unsigned not NULL)' CREATE_LITERAL_STATEMENTS_TABLE = '\nCREATE TABLE %s_literal_statements (\n subject text not NULL,\n predicate text not NULL,\n object text,\n context text not NULL,\n termComb tinyint unsigned not NULL,\n objLanguage varchar(3),\n objDatatype text)' CREATE_QUOTED_STATEMENTS_TABLE = '\nCREATE TABLE %s_quoted_statements (\n subject text not NULL,\n predicate text not NULL,\n object text,\n context text not NULL,\n termComb tinyint unsigned not NULL,\n objLanguage varchar(3),\n objDatatype text)' CREATE_NS_BINDS_TABLE = '\nCREATE TABLE %s_namespace_binds (\n prefix varchar(20) UNIQUE not NULL,\n uri text,\n PRIMARY KEY (prefix))'