Пример #1
0
 def testLocationPath(self):
     q = "/pkg/rt/rootnode"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), q.split('/')[1:])
     q = "/pkg/rt/rootnode/node1/node2"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), q.split('/')[1:])
     q = "/pkg/rt/rootnode/node2/node1"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), q.split('/')[1:])
Пример #2
0
 def testXPathQuery(self):
     q = "/testpackage/testtype[./rootnode/element1/element2 = 'blub' " + \
         "and rootnode/./element1/@id <= 5] " + \
         "order by rootnode/element1/element2 desc, rootnode/element3 asc" + \
         " limit 10,20"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), ['testpackage', 'testtype'])
     self.assertEqual(query.getOrderBy(), [[['testpackage', 'testtype',
                                           'rootnode/element1/element2'],
                                           'desc'],
                                           [['testpackage', 'testtype',
                                            'rootnode/element3'], 'asc']])
     self.assertEqual(query.getLimit(), 10)
     self.assertEqual(query.getOffset(), 20)
Пример #3
0
 def testLocationPath(self):
     q = "/pkg/rt/rootnode"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), q.split('/')[1:])
     q = "/pkg/rt/rootnode/node1/node2"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), q.split('/')[1:])
     q = "/pkg/rt/rootnode/node2/node1"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), q.split('/')[1:])
Пример #4
0
 def testXPathQuery(self):
     q = "/testpackage/testtype[./rootnode/element1/element2 = 'blub' " + \
         "and rootnode/./element1/@id <= 5] " + \
         "order by rootnode/element1/element2 desc, rootnode/element3 asc" + \
         " limit 10,20"
     query = XPathQuery(q)
     self.assertEqual(query.getLocationPath(), ['testpackage', 'testtype'])
     self.assertEqual(query.getOrderBy(), [[['testpackage', 'testtype',
                                           'rootnode/element1/element2'],
                                           'desc'],
                                           [['testpackage', 'testtype',
                                            'rootnode/element3'], 'asc']])
     self.assertEqual(query.getLimit(), 10)
     self.assertEqual(query.getOffset(), 20)
Пример #5
0
 def query(self, query, full=False):
     """
     Query the catalog via restricted XPath queries.
     
     The values returned depend on the type of query:
     
     Is the location path of a query on resource level, i.e. on rootnode or 
     above (e.g. '/package/resourcetype/*'), ALL indexes known for that 
     resource are requested and returned as a dict.
     
     Does the location path address a node other than the rootnode (e.g.
     '/package/resourcetype/rootnode/node1/node2'), indexed data for that
     node ONLY is returned. 
     Note: The index '/package/resourcetype/rootnode/node1/node2' has to 
     exist, of course. 
     
     The result set is a dict of the form {document_ids : {xpath:value}, 
     ...}. 
     There is an additional key 'ordered' containing an ORDERED list of
     document ids, which is of interest in case there is an order by clause,
     as the dict itself does not preserve order.
     
     For further detail on the restricted XPath query syntax, see 
     L{seishub.xmldb.xpath}
     
     @param query: Restricted XPath query to be executed.
     @type query: basestring
     @param full: If True, picks the resource objects for the results
     @return: Either a list of Resource objects, or a dict
     """
     query = applyMacros(query)
     q = XPathQuery(query)
     results = self.index_catalog.query(q)
     if not full:
         return results
     return [self.xmldb.getResource(document_id=id)
             for id in results['ordered']]
Пример #6
0
    def test_runXPathQuery(self):
        # create test catalog
        self._setup_testdata()
        #======================================================================
        # location path queries
        #======================================================================
        # all resources of package testpackage, resourcetype 'station' with
        # rootnode 'station'
        q = "/testpackage/station/station"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 2)
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)
        # all resources of package testpackage, resourcetype 'station'
        q = "/testpackage/station/*"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 2)
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)
        # all resources of package testpackage, resourcetype 'station', limit 1
        q = "/testpackage/station/* limit 1"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 1)
        self.assertTrue(self.res1.document._id in res)
        # all resources of package testpackage, resourcetype station, offset 1
        q = "/testpackage/station/* limit 1 offset 1"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 1)
        self.assertTrue(self.res2.document._id in res)
        # all resources of package testpackage, resourcetype station, offset 1
        q = "/testpackage/station/* limit 1,1"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 1)
        self.assertTrue(self.res2.document._id in res)
        # all resources of package testpackage
        q = "/testpackage/*/*"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 3)
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)
        self.assertTrue(self.res3.document._id in res)
        # all resources
        q = "/*/*/*"
        res = self.catalog.query(XPathQuery(q))
        assert len(res['ordered']) >= 3
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)
        self.assertTrue(self.res3.document._id in res)

        #======================================================================
        # node existence queries
        #======================================================================
        q = "/testpackage/station[station/lat]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 2)
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)

        q = "/testpackage/station[station/XY/paramXY]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 1)
        self.assertEqual(res['ordered'], [self.res2.document._id])

        #======================================================================
        # key queries
        #======================================================================
        # single key query
        q = "/testpackage/station[station/lon = 12.51200]"
        xpq = XPathQuery(q)
        res = self.catalog.query(xpq)
        self.assertEqual(res['ordered'], [self.res1.document._id])

        # multiple key queries
        q = "/testpackage/station[station/lon != 12.51200 and " + \
            "station/lat = 55.23200]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res2.document._id])
        q = "/testpackage/station[station/lat = 55.23200 and " + \
            "station/lon != 12.51200]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res2.document._id])
        q = "/testpackage/station[station/lon = 12.51200 or " + \
            "station/lon = 22.51200]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 2)
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)
        q = "/testpackage/station[station/lon = 12.51200 or " + \
            "station/lon = 0.51200]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res1.document._id])
        q = "/testpackage/station[station/lon = 12.51200 or " + \
            "station/XY/paramXY = 2.5]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 2)
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)
        q = "/testpackage/station[station/lon = 12.51200 or " + \
            "station/XY/paramXY = -100]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res1.document._id])

        #======================================================================
        # combined queries
        #======================================================================
        # node existance AND key query
        q = "/testpackage/station[station/XY/paramXY and " + \
            "station/lon = 12.51200]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 0)
        q = "/testpackage/station[station/XY/paramXY and " + \
            "station/lon = 22.51200]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res2.document._id])
        q = "/testpackage/station[station/lon = 12.51200 and " + \
            "station/XY/paramXY]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 0)
        q = "/testpackage/station[station/lon = 22.51200 and " + \
            "station/XY/paramXY]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res2.document._id])

        # node existance OR key query
        q = "/testpackage/station[station/XY/paramXY or " + \
            "station/lon = 12.51200]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 2)
        self.assertTrue(self.res1.document._id in res)
        self.assertTrue(self.res2.document._id in res)

        #======================================================================
        # queries w/ order_by and limit clause
        #======================================================================
        # predicate query w/ order_by
        q = "/sortordertests/sotest[sortorder/int1] " + \
            "order by sortorder/int1 desc"
        res = self.catalog.query(XPathQuery(q))
        res_ids = [r.document._id for r in self.so_res]
        res_ids.reverse()
        self.assertEqual(res['ordered'], res_ids)

        so1 = "/sortordertests/sotest[sortorder/int1] " + \
              "order by sortorder/int1 desc " + \
              "limit 3"
        so2 = "/sortordertests/sotest[sortorder/int1] " + \
              "order by sortorder/int1 desc " + \
              "offset 2"
        so3 = "/sortordertests/sotest[sortorder/int1] " + \
              "order by sortorder/int2 asc, sortorder/str2 desc " + \
              "limit 5,2"
        so4 = "/sortordertests/sotest " + \
              "order by sortorder/int2 desc, sortorder/str2 desc " + \
              "limit 3"
        so5 = "/sortordertests/sotest[sortorder/int1] " + \
              "order by sortorder/int2 asc, sortorder/str2 desc " + \
              "limit 5 offset 2"
        res1 = self.catalog.query(XPathQuery(so1))
        res2 = self.catalog.query(XPathQuery(so2))
        res3 = self.catalog.query(XPathQuery(so3))
        res4 = self.catalog.query(XPathQuery(so4))
        res5 = self.catalog.query(XPathQuery(so5))

        self.assertEqual(res1['ordered'], res_ids[:3])
        self.assertEqual(res2['ordered'], res_ids[2:])
        res_ids.reverse()
        self.assertEqual(res3['ordered'], [res_ids[4], res_ids[1], res_ids[2]])
        self.assertEqual(res4['ordered'], [res_ids[1], res_ids[2], res_ids[0]])
        self.assertEqual(res5['ordered'], [res_ids[4], res_ids[1], res_ids[2]])

        #======================================================================
        # queries w/ not(...)
        #======================================================================
        q = "/testpackage/station[not(station/XY/paramXY)]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 1)
        self.assertEqual(res['ordered'], [self.res1.document._id])
        q = "/testpackage/station[station/XY/paramXY != '2.5']"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res2.document._id])
        q = "/testpackage/station[not(station/XY/paramXY = '2.5')]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res1.document._id])
        q = "/testpackage/station[not(station/XY/paramXY = '2.5' " + \
            "and station/XY/paramXY = '0' and station/XY/paramXY = '99')]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res1.document._id])
        q = "/testpackage/station[not(station/XY/paramXY = '2.5')]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res1.document._id])

        #======================================================================
        # queries w/ labels
        #======================================================================
        q = "/testpackage/station[longitude]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(len(res['ordered']), 2)
        q = "/testpackage/station[longitude = 22.51200 and station/XY/paramXY]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res2.document._id])
        q = "/testpackage/station[longitude=22.51200 and paramXY=5]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [])
        q = "/testpackage/station[longitude=22.51200 and paramXY=2.5]"
        res = self.catalog.query(XPathQuery(q))
        self.assertEqual(res['ordered'], [self.res2.document._id])

        #======================================================================
        # invalid queries
        #======================================================================
        # unknown index
        q = "/testpackage/station[station/XY]"
        self.assertRaises(NotFoundError, self.catalog.query, XPathQuery(q))
        # remove test catalog
        self._cleanup_testdata()