def test_datastore_query(self): if self.server_type != "postgresql": raise SkipTest("find_resources_mult only works with Postgres") data_store = self.ds_class(datastore_name='ion_test_ds', profile=DataStore.DS_PROFILE.RESOURCES, scope=get_sys_name()) self.data_store = data_store self.resources = {} # Create a few resources plat1_obj_id = self._create_resource(RT.PlatformDevice, 'Buoy1', description='My Platform') from interface.objects import GeospatialIndex dp1_obj_id = self._create_resource(RT.PlatformSite, 'Site1', geospatial_point_center=GeospatialIndex(lat=1.0, lon=2.0)) # Queries qb = DatastoreQueryBuilder() qb.build_query(where=qb.or_(qb.and_(qb.eq(qb.RA_NAME, "Buoy1"), qb.eq(qb.RA_NAME, "Buoy1")), qb.eq(qb.RA_NAME, "Buoy1"))) res = data_store.find_resources_mult(qb.get_query()) print res qb = DatastoreQueryBuilder() qb.build_query(where=qb.and_(qb.like(qb.RA_NAME, "Si%"), qb.overlaps_bbox(qb.RA_GEOM, 1, -1.2, 4, 4))) res = data_store.find_resources_mult(qb.get_query()) print res qb = DatastoreQueryBuilder() qb.build_query(where=qb.attr_like("description", "My%")) res = data_store.find_resources_mult(qb.get_query()) print res
def test_datastore_query(self): data_store = self.ds_class(datastore_name='ion_test_ds', profile=DataStore.DS_PROFILE.RESOURCES, scope=get_sys_name()) # Just in case previous run failed without cleaning up, delete data store try: data_store.delete_datastore() except NotFound: pass data_store.create_datastore() self.data_store = data_store self.resources = {} from interface.objects import GeospatialIndex, ResourceVisibilityEnum, GeospatialLocation # Create a few resources plat1_obj_id = self._create_resource(RT.TestPlatform, 'Buoy1', description='My Platform') aid1_obj_id = self._create_resource(RT.ActorIdentity, 'Actor1') plat2_obj_id = self._create_resource(RT.TestPlatform, 'Buoy2', visibility=ResourceVisibilityEnum.OWNER) self._create_association(plat2_obj_id, PRED.hasOwner, aid1_obj_id) plat3_obj_id = self._create_resource(RT.TestPlatform, 'Buoy3', visibility=ResourceVisibilityEnum.OWNER) dp1_obj_id = self._create_resource(RT.TestSite, 'Site1', location=GeospatialLocation(latitude=1.0, longitude=2.0)) # Queries qb = DatastoreQueryBuilder() qb.build_query(where=qb.or_(qb.and_(qb.eq(qb.RA_NAME, "Buoy1"), qb.eq(qb.RA_NAME, "Buoy1")), qb.eq(qb.RA_NAME, "Buoy1"))) res = data_store.find_by_query(qb.get_query()) self.assertEquals(len(res), 1) qb = DatastoreQueryBuilder() qb.build_query(where=qb.and_(qb.like(qb.RA_NAME, "Si%"), qb.overlaps_bbox(qb.RA_GEOM, 1, -1.2, 4, 4))) res = data_store.find_by_query(qb.get_query()) self.assertEquals(len(res), 1) qb = DatastoreQueryBuilder() qb.build_query(where=qb.attr_like("description", "My%")) res = data_store.find_by_query(qb.get_query()) self.assertEquals(len(res), 1) # two tests: first should NOT have above Site1 in radius, second should qb = DatastoreQueryBuilder(where=qb.overlaps_geom(qb.RA_GEOM,'POINT(2.0 2.0)',0.5)) qb.build_query() res = data_store.find_by_query(qb.get_query()) self.assertEquals(len(res), 0) # -- additional 0.001 is to compensate for outer edge NOT being considered an overlap/intersect qb = DatastoreQueryBuilder(where=qb.overlaps_geom(qb.RA_GEOM,'POINT(2.0 2.0)',1.001)) qb.build_query() res = data_store.find_by_query(qb.get_query()) self.assertEquals(len(res), 1) # Access tests qb = DatastoreQueryBuilder() qb.build_query(where=qb.or_(qb.and_(qb.like(qb.RA_NAME, "Buoy%"), qb.eq(qb.ATT_TYPE, RT.TestPlatform)))) res = data_store.find_by_query(qb.get_query()) self.assertEquals(len(res), 1) access_args = create_access_args(current_actor_id=aid1_obj_id) res = data_store.find_by_query(qb.get_query(), access_args=access_args) self.assertEquals(len(res), 2) access_args = create_access_args(current_actor_id=aid1_obj_id, superuser_actor_ids=[aid1_obj_id]) res = data_store.find_by_query(qb.get_query(), access_args=access_args) self.assertEquals(len(res), 3) # Clean up self.data_store.delete_mult([plat1_obj_id, plat2_obj_id, plat3_obj_id, aid1_obj_id, dp1_obj_id])