Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/creactistore/_templates/lib/rdflib/query.py
diff options
context:
space:
mode:
Diffstat (limited to 'creactistore/_templates/lib/rdflib/query.py')
-rw-r--r--creactistore/_templates/lib/rdflib/query.py173
1 files changed, 173 insertions, 0 deletions
diff --git a/creactistore/_templates/lib/rdflib/query.py b/creactistore/_templates/lib/rdflib/query.py
new file mode 100644
index 0000000..7ae1928
--- /dev/null
+++ b/creactistore/_templates/lib/rdflib/query.py
@@ -0,0 +1,173 @@
+
+import os
+import shutil
+import tempfile
+
+from urlparse import urlparse
+try:
+ from io import BytesIO
+except:
+ from StringIO import StringIO as BytesIO
+
+
+__all__ = ['Processor', 'Result']
+
+
+"""
+Query plugin interface.
+
+This module is useful for those wanting to write a query processor
+that can plugin to rdf. If you are wanting to execute a query you
+likely want to do so through the Graph class query method.
+
+"""
+
+
+class Processor(object):
+
+ def __init__(self, graph):
+ pass
+
+ def query(self, strOrQuery, initBindings={}, initNs={}, DEBUG=False):
+ pass
+
+class ResultException(Exception):
+ pass
+
+class EncodeOnlyUnicode(object):
+ """
+ This is a crappy work-around for
+ http://bugs.python.org/issue11649
+
+
+ """
+
+ def __init__(self, stream):
+ self.__stream=stream
+ def write(self, arg):
+ if isinstance(arg, unicode):
+ self.__stream.write(arg.encode("utf-8"))
+ else:
+ self.__stream.write(arg)
+ def __getattr__(self, name):
+ return getattr(self.__stream, name)
+
+
+class Result(object):
+ """
+ A common class for representing query result.
+ This is backwards compatible with the old SPARQLResult objects
+ Like before there is a bit of magic that makes this appear like python objects, depending on the type of result.
+
+ If the type is "SELECT", this is like a list of list of values
+ If the type is "ASK" this is like a list of a single bool
+ If the type is "CONSTRUCT" or "DESCRIBE" this is like a graph
+
+ """
+ def __init__(self, type_):
+
+ if type_ not in ('CONSTRUCT', 'DESCRIBE', 'SELECT', 'ASK'):
+ raise ResultException('Unknown Result type: %s'%type_)
+
+ self.type = type_
+ self.vars=None
+ self.bindings=None
+ self.askAnswer=None
+ self.graph=None
+
+ @staticmethod
+ def parse(source, format='xml'):
+ from rdflib import plugin
+ parser=plugin.get(format, ResultParser)()
+ return parser.parse(source)
+
+
+ def serialize(self, destination=None, encoding="utf-8", format='xml', **args):
+
+ if self.type in ('CONSTRUCT', 'DESCRIBE'):
+ return self.graph.serialize(destination, encoding=encoding, format=format, **args)
+
+ """stolen wholesale from graph.serialize"""
+ from rdflib import plugin
+ serializer=plugin.get(format, ResultSerializer)(self)
+ if destination is None:
+ stream = BytesIO()
+ stream2 = EncodeOnlyUnicode(stream)
+ serializer.serialize(stream2, encoding=encoding, **args)
+ return stream.getvalue()
+ if hasattr(destination, "write"):
+ stream = destination
+ serializer.serialize(stream, encoding=encoding, **args)
+ else:
+ location = destination
+ scheme, netloc, path, params, query, fragment = urlparse(location)
+ if netloc!="":
+ print("WARNING: not saving as location" + \
+ "is not a local file reference")
+ return
+ fd, name = tempfile.mkstemp()
+ stream = os.fdopen(fd, 'wb')
+ serializer.serialize(stream, encoding=encoding, **args)
+ stream.close()
+ if hasattr(shutil,"move"):
+ shutil.move(name, path)
+ else:
+ shutil.copy(name, path)
+ os.remove(name)
+
+
+ def __len__(self):
+ if self.type=='ASK': return 1
+ elif self.type=='SELECT': return len(self.bindings)
+ else:
+ return len(self.graph)
+
+ def __iter__(self):
+ if self.type in ("CONSTRUCT", "DESCRIBE"):
+ for t in self.graph: yield t
+ elif self.type=='ASK':
+ yield self.askAnswer
+ elif self.type=='SELECT':
+ # To remain compatible with the old SPARQLResult behaviour
+ # this iterates over lists of variable bindings
+ for b in self.bindings:
+ yield tuple([b[v] for v in self.vars])
+
+
+ def __getattr__(self,name):
+ if self.type in ("CONSTRUCT", "DESCRIBE") and self.graph!=None:
+ return self.graph.__getattr__(self,name)
+ else:
+ raise AttributeError("'%s' object has not attribute '%s'"%(self,name))
+
+ def __eq__(self, other):
+ try:
+ if self.type!=other.type: return False
+ if self.type=='ASK':
+ return self.askAnswer==other.askAnswer
+ elif self.type=='SELECT':
+ return self.vars==other.vars and self.bindings==other.bindings
+ else:
+ return self.graph==other.graph
+
+ except:
+ return False
+
+class ResultParser(object):
+
+ def __init__(self):
+ pass
+
+ def parse(self, source):
+ """return a Result object"""
+ pass # abstract
+
+class ResultSerializer(object):
+
+ def __init__(self, result):
+ self.result=result
+
+ def serialize(self, stream, encoding="utf-8"):
+ """return a string properly serialized"""
+ pass # abstract
+