Exemplo n.º 1
0
    def query(self, constraint, sortby=None, typenames=None,
        maxrecords=10, startposition=0):
        ''' Query records from underlying repository '''

        # run the raw query and get total
        if 'where' in constraint:  # GetRecords with constraint
            LOGGER.debug('constraint detected')
            query = self.session.query(self.dataset).filter(
            constraint['where'])
        else:  # GetRecords sans constraint
            LOGGER.debug('No constraint detected')
            query = self.session.query(self.dataset)

        total = query.count()

        if sortby is not None:  # apply sorting
            LOGGER.debug('sorting detected')
            sortby_column = getattr(self.dataset, sortby['propertyname'])

            if sortby['order'] == 'DESC':  # descending sort
                if 'spatial' in sortby and sortby['spatial']:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column).desc())
                else:  # aspatial sort
                    query = query.order_by(sortby_column.desc())
            else:  # ascending sort
                if 'spatial' in sortby and sortby['spatial']:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column))
                else:  # aspatial sort
                    query = query.order_by(sortby_column)

        # always apply limit and offset
        return [str(total), query.limit(
        maxrecords).offset(startposition).all()]
Exemplo n.º 2
0
    def query(self, constraint, sortby=None, typenames=None, maxrecords=10, startposition=0):
        """ Query records from underlying repository """

        # run the raw query and get total
        if "where" in constraint:  # GetRecords with constraint
            LOGGER.debug("constraint detected")
            query = (
                self.session.query(self.dataset)
                .filter(text(constraint["where"]))
                .params(self._create_values(constraint["values"]))
            )
        else:  # GetRecords sans constraint
            LOGGER.debug("No constraint detected")
            query = self.session.query(self.dataset)

        total = query.count()

        if util.ranking_pass:  # apply spatial ranking
            # TODO: Check here for dbtype so to extract wkt from postgis native to wkt
            LOGGER.debug("spatial ranking detected")
            LOGGER.debug(
                "Target WKT: %s", getattr(self.dataset, self.context.md_core_model["mappings"]["pycsw:BoundingBox"])
            )
            LOGGER.debug("Query WKT: %s", util.ranking_query_geometry)
            query = query.order_by(
                func.get_spatial_overlay_rank(
                    getattr(self.dataset, self.context.md_core_model["mappings"]["pycsw:BoundingBox"]),
                    util.ranking_query_geometry,
                ).desc()
            )
            # trying to make this wsgi safe
            util.ranking_pass = False
            util.ranking_query_geometry = ""

        if sortby is not None:  # apply sorting
            LOGGER.debug("sorting detected")
            # TODO: Check here for dbtype so to extract wkt from postgis native to wkt
            sortby_column = getattr(self.dataset, sortby["propertyname"])

            if sortby["order"] == "DESC":  # descending sort
                if "spatial" in sortby and sortby["spatial"]:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column).desc())
                else:  # aspatial sort
                    query = query.order_by(sortby_column.desc())
            else:  # ascending sort
                if "spatial" in sortby and sortby["spatial"]:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column))
                else:  # aspatial sort
                    query = query.order_by(sortby_column)

        # always apply limit and offset
        return [str(total), query.limit(maxrecords).offset(startposition).all()]
Exemplo n.º 3
0
    def query(self, constraint, sortby=None, typenames=None,
        maxrecords=10, startposition=0):
        ''' Query records from underlying repository '''

        typename_column = getattr(self.dataset, \
        self.context.md_core_model['mappings']['pycsw:Typename'])

        # run the raw query and get total
        if constraint.has_key('where'):  # GetRecords with constraint
            if not typenames:  # any typename
                query = self.session.query(self.dataset).filter(
                constraint['where'])
            else:
                query = self.session.query(self.dataset).filter(
                typename_column.in_(typenames)).filter(
                constraint['where'])

            total = query.count()

        else:  # GetRecords sans constraint
            if not typenames:  # any typename
                query = self.session.query(self.dataset)
            else:
                query = self.session.query(self.dataset).filter(
                typename_column.in_(typenames))

            total = query.count()

        if sortby is not None:  # apply sorting
            sortby_column = getattr(self.dataset, sortby['propertyname'])

            if sortby['order'] == 'DESC':  # descending sort
                if sortby.has_key('spatial') and sortby['spatial'] is True:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column).desc())
                else:  # aspatial sort
                    query = query.order_by(sortby_column.desc())
            else:  # ascending sort
                if sortby.has_key('spatial') and sortby['spatial'] is True:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column))
                else:  # aspatial sort
                    query = query.order_by(sortby_column)

        # always apply limit and offset
        return [str(total), query.limit(
        maxrecords).offset(startposition).all()]
Exemplo n.º 4
0
    def query(self, constraint, sortby=None, typenames=None,
        maxrecords=10, startposition=0):
        ''' Query records from underlying repository '''

        # run the raw query and get total
        if 'where' in constraint:  # GetRecords with constraint
            LOGGER.debug('constraint detected')
            query = self.session.query(self.dataset).filter(
            text(constraint['where'])).params(self._create_values(constraint['values']))
        else:  # GetRecords sans constraint
            LOGGER.debug('No constraint detected')
            query = self.session.query(self.dataset)

        total = self._get_repo_filter(query).count()

        if util.ranking_pass:  #apply spatial ranking
            #TODO: Check here for dbtype so to extract wkt from postgis native to wkt
            LOGGER.debug('spatial ranking detected')
            LOGGER.debug('Target WKT: %s', getattr(self.dataset, self.context.md_core_model['mappings']['pycsw:BoundingBox']))
            LOGGER.debug('Query WKT: %s', util.ranking_query_geometry)
            query = query.order_by(func.get_spatial_overlay_rank(getattr(self.dataset, self.context.md_core_model['mappings']['pycsw:BoundingBox']), util.ranking_query_geometry).desc())
            #trying to make this wsgi safe
            util.ranking_pass = False
            util.ranking_query_geometry = ''

        if sortby is not None:  # apply sorting
            LOGGER.debug('sorting detected')
            #TODO: Check here for dbtype so to extract wkt from postgis native to wkt
            sortby_column = getattr(self.dataset, sortby['propertyname'])

            if sortby['order'] == 'DESC':  # descending sort
                if 'spatial' in sortby and sortby['spatial']:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column).desc())
                else:  # aspatial sort
                    query = query.order_by(sortby_column.desc())
            else:  # ascending sort
                if 'spatial' in sortby and sortby['spatial']:  # spatial sort
                    query = query.order_by(func.get_geometry_area(sortby_column))
                else:  # aspatial sort
                    query = query.order_by(sortby_column)

        # always apply limit and offset
        return [str(total), self._get_repo_filter(query).limit(
        maxrecords).offset(startposition).all()]