def test_distinct(self): qs = QuerySet(using=self.db, collection=COLLECTION, xpath='//name') vals = qs.distinct() self.assertTrue('one' in vals) self.assertTrue('two' in vals) self.assertTrue('three' in vals) self.assertTrue('four' in vals) self.assertTrue('abc' not in vals)
def setUp(self): self.db = ExistDB(server_url=EXISTDB_SERVER_URL, username=EXISTDB_SERVER_USER, password=EXISTDB_SERVER_PASSWORD) load_fixtures(self.db) self.qs = QuerySet(using=self.db, xpath='/root', collection=COLLECTION, model=QueryTestModel)
def test_filter_fulltext_options(self): qs = QuerySet(using=self.db, xpath='/root', collection=COLLECTION, model=QueryTestModel, fulltext_options={'default-operator': 'and'}) # search for terms present in fixtures - but not both present in one doc fqs = qs.filter(description__fulltext_terms='only third') # for now, just confirm that the option is passed through to query self.assertTrue( '<default-operator>and</default-operator>' in fqs.query.getQuery())
def setUp(self): self.db = ExistDB(server_url=EXISTDB_SERVER_URL, username=EXISTDB_SERVER_USER, password=EXISTDB_SERVER_PASSWORD) # create index for collection - should be applied to newly loaded files self.db.loadCollectionIndex(COLLECTION, self.FIXTURE_INDEX) load_fixtures(self.db) self.qs = QuerySet(using=self.db, xpath='/root', collection=COLLECTION, model=QueryTestModel)
def test_also_subfield(self): class SubqueryTestModel(xmlmap.XmlObject): subname = xmlmap.StringField('subname') parent = xmlmap.NodeField('parent::root', QueryTestModel) qs = QuerySet(using=self.db, collection=COLLECTION, model=SubqueryTestModel, xpath='//sub') name = qs.also('parent__id', 'parent__wnn').get(subname__exact='la') self.assertEqual('la', name.subname) self.assertEqual('one', name.parent.id) self.assertEqual(42, name.parent.wnn)
def test_also(self): class SubqueryTestModel(xmlmap.XmlObject): name = xmlmap.StringField('.') parent_id = xmlmap.StringField('parent::root/@id') qs = QuerySet(using=self.db, collection=COLLECTION, model=SubqueryTestModel, xpath='//name') name = qs.also('parent_id').get(name__exact='two') self.assertEqual( 'abc', name.parent_id, "parent id set correctly when returning at name level with also parent_id specified; should be 'abc', got '" + name.parent_id + "'")
def test_filter_gtelte(self): # < <= > >= # subclass to add a numeric field to test with class CountQueryTestModel(QueryTestModel): name_count = xmlmap.IntegerField('count(name)') qs = QuerySet(using=self.db, xpath='/root', collection=COLLECTION, model=CountQueryTestModel) # each fixture has one and only one name self.assertEqual(0, qs.filter(name_count__gt=1).count()) self.assertEqual(4, qs.filter(name_count__gte=1).count()) self.assertEqual(4, qs.filter(name_count__lte=1).count()) self.assertEqual(0, qs.filter(name_count__lt=1).count())
def test_only_raw(self): qs = self.qs.only_raw( id='xs:string(%(xq_var)s//name/ancestor::root/@id)').filter( name='two') self.assertEqual('abc', qs[0].id) # filtered version obj = qs.get() self.assertEqual('abc', obj.id) # when combined with regular only, other fields come back correctly qs = self.qs.only('name', 'description', 'substring') obj = qs.only_raw( id='xs:string(%(xq_var)s//name/ancestor::root/@id)').get(id='abc') self.assertEqual('two', obj.name) self.assertEqual('t', obj.substring) self.assertEqual('this one only has two', obj.description) self.assertEqual('abc', obj.id) # subfield obj = qs.only_raw( sub__subname='normalize-space(%(xq_var)s//subname)').get(id='one') self.assertEqual('la', obj.sub.subname) # multiple parameters obj = self.qs.filter(id='abc').only_raw( id='string(%(xq_var)s/@id)', name='normalize-space(%(xq_var)s//name)').get(id='abc') self.assertEqual('abc', obj.id) self.assertEqual('two', obj.name) # list field - multiple return values class MyQueryTest(QueryTestModel): name = xmlmap.StringListField('name') qs = QuerySet(using=self.db, xpath='/root', collection=COLLECTION, model=MyQueryTest) # return one object but find all the names in the test collection obj = qs.filter(id='abc').only_raw(name='collection("/db%s")//name' % COLLECTION).get(id='abc') # 4 names in test fixtures - should come back as a list of those 4 names self.assertEqual(4, len(obj.name))
def test_also_raw(self): class SubqueryTestModel(QueryTestModel): myid = xmlmap.StringField('@id') qs = QuerySet(using=self.db, collection=COLLECTION, model=SubqueryTestModel, xpath='/root') qs = qs.filter(id='abc').also_raw( myid='string(%(xq_var)s//name/ancestor::root/@id)') self.assertEqual('abc', qs[0].myid) # filtered version of the queryset with raw obj = qs.filter(name='two').get() self.assertEqual('abc', obj.myid) # multiple parameters obj = qs.filter(id='abc').also_raw( id='string(%(xq_var)s/@id)', name='normalize-space(%(xq_var)s//name)').get(id='abc') self.assertEqual('abc', obj.id) self.assertEqual('two', obj.name)
def get_query_set(self): """ Get the default :class:`pyexistdb.db.QuerySet` returned by this ``Manager``. Typically this returns a ``QuerySet`` based on the ``Manager``'s `xpath`, evaluated in the ``settings.EXISTDB_ROOT_COLLECTION`` on a default :class:`pyexistdb.db.ExistDB`. This is a convenient point for developers to customize an object's managers. Deriving a child class from Manager and overriding or extending this method is a handy way to create custom queries accessible from an :class:`~eulexistdb.models.XmlModel`. """ if hasattr(settings, 'EXISTDB_FULLTEXT_OPTIONS'): fulltext_opts = settings.EXISTDB_FULLTEXT_OPTIONS else: fulltext_opts = {} return QuerySet(model=self.model, xpath=self.xpath, using=ExistDB(), collection=settings.EXISTDB_ROOT_COLLECTION, fulltext_options=fulltext_opts)