Mikkel Kamstrup Erlandsen has proposed merging
lp:~kamstrup/zeitgeist/query-expansion into lp:zeitgeist.
Requested reviews:
Zeitgeist Framework Team (zeitgeist)
Huzzah! Smackeroo! I have query expansion fully working now all unit tests
passing. Both on the SQL level and on our template matching level.
So what does "query expansion" mean. Consider a query for subject with interp.
nfo:Media. Right that would only match stuff that has been explicitly
identified as nfo:Media (which is not much since we usually can identify whther
stuff is Audio, Image, or Video data).
With query expansion we'll also match any children of nfo:Media. Ie also
nfo:Image, nfo:Audio, and nfo:Video. Also recursively matching children of
these like nfo:RasterImage and nfo:Vector image.
The way it's implemented is really simple. We simply expand the tree of
children and compile a big OR query with everything.
--
https://code.launchpad.net/~kamstrup/zeitgeist/query-expansion/+merge/25000
Your team Zeitgeist Framework Team is requested to review the proposed merge of
lp:~kamstrup/zeitgeist/query-expansion into lp:zeitgeist.
=== modified file '_zeitgeist/engine/main.py'
--- _zeitgeist/engine/main.py 2010-05-01 22:18:55 +
+++ _zeitgeist/engine/main.py 2010-05-10 14:47:20 +
@@ -32,7 +32,7 @@
from collections import defaultdict
from zeitgeist.datamodel import Event as OrigEvent, StorageState, TimeRange, \
- ResultType, get_timestamp_for_now, Interpretation
+ ResultType, get_timestamp_for_now, Interpretation, Symbol
from _zeitgeist.engine.datamodel import Event, Subject
from _zeitgeist.engine.extension import ExtensionsCollection, load_class
from _zeitgeist.engine import constants
@@ -163,16 +163,51 @@
for (event_template, subject_template) in self._build_templates(templates):
subwhere = WhereClause(WhereClause.AND)
try:
-for key in ("interpretation", "manifestation", "actor"):
- value = getattr(event_template, key)
- if value:
- subwhere.add("%s = ?" % key,
- getattr(self, "_" + key).id(value))
-for key in ("interpretation", "manifestation", "mimetype"):
- value = getattr(subject_template, key)
- if value:
- subwhere.add("subj_%s = ?" % key,
- getattr(self, "_" + key).id(value))
+# Expand event interpretation children
+event_interp_where = WhereClause(WhereClause.OR)
+for child_interp in (Symbol.find_child_uris_extended(event_template.interpretation)):
+ if child_interp:
+ event_interp_where.add("interpretation = ?",
+ self._interpretation.id(child_interp))
+if event_interp_where:
+ subwhere.extend(event_interp_where)
+
+# Expand event manifestation children
+event_manif_where = WhereClause(WhereClause.OR)
+for child_manif in (Symbol.find_child_uris_extended(event_template.manifestation)):
+ if child_manif:
+ event_manif_where.add("manifestation = ?",
+ self._manifestation.id(child_manif))
+if event_manif_where:
+ subwhere.extend(event_manif_where)
+
+# Expand subject interpretation children
+su_interp_where = WhereClause(WhereClause.OR)
+for child_interp in (Symbol.find_child_uris_extended(subject_template.interpretation)):
+ if child_interp:
+ su_interp_where.add("subj_interpretation = ?",
+ self._interpretation.id(child_interp))
+if su_interp_where:
+ subwhere.extend(su_interp_where)
+
+# Expand subject manifestation children
+su_manif_where = WhereClause(WhereClause.OR)
+for child_manif in (Symbol.find_child_uris_extended(subject_template.manifestation)):
+ if child_manif:
+ su_manif_where.add("subj_manifestation = ?",
+ self._manifestation.id(child_manif))
+if su_manif_where:
+ subwhere.extend(su_manif_where)
+
+# FIXME: Expand mime children as well.
+# Right now we only do exact matching for mimetypes
+if subject_template.mimetype:
+ subwhere.add("subj_mimetype = ?",
+ self._mimetype.id(subject_tempalte.mimetype))
+
+if event_template.actor:
+ subwhere.add("actor = ?",
+ self._actor.id(event_template.actor))
except KeyError:
# Value not in DB
where_or.register_no_result()
@@ -183,6 +218,7 @@
subwhere.add("subj_%s = ?" % key, value)
where_or.extend(subwhere)
+ print "SQL: ", where_or.sql, where_or.arguments
return where_or
def _build_sql_event_filter(self, time_range, templates, storage_state):
=== modified file 'test/datamodel-test.py'
--- test/datamodel-test.py 2010-04-26 19:42:07 +
+++ test/datamodel-test.py 2010-05-10 14:47:20 +
@@ -51,6 +51,47 @@
self.assertTrue(f.display_name != None)
self.assertTrue(f.doc != None)
+class RelationshipTest (unittest.TestCase):
+ """
+ Tests for parent/child relationships in the loaded ontologies
+ """
+
+ def testDirectParents (self):
+ """
+ Tests relationshi