Example #1
0
def _prepare_delete_many_query(resources, context, inverse=False):
    query = delete()
    if context:
        query.from_(context)

    query.template(("?s", "?p", "?o"))

    if context:
        where_clause = NamedGroup(context)
    else:
        where_clause = Group()

    subjects = [resource.subject for resource in resources]
    filter = " OR ".join(
        [u"?s = <{0:s}>".format(subject) for subject in subjects])
    filter = Filter("(%s)" % filter)

    if inverse:
        filter2 = " OR ".join(
            [u"?o = <{0:s}>".format(subject) for subject in subjects])
        filter2 = Filter("(%s)" % filter2)

        where1 = Group([("?s", "?p", "?o"), filter])
        where2 = Group([("?s", "?p", "?o"), filter2])
        where_clause.append(Union([where1, where2]))
    else:
        where_clause.append(("?s", "?p", "?o"))
        where_clause.append(filter)

    query.where(where_clause)

    return query
Example #2
0
def _apply_solution_modifiers(params, query):
    """
    Apply limit, offset, order parameters to query.
    """
    if "limit" in params:
        query.limit(params["limit"])

    if "offset" in params:
        query.offset(params["offset"])

    if "get_by" in params:

        def order_terms(s, p, o):
            return (s, p, o) if direct else (o, p, s)

        for attribute, values, direct in params["get_by"]:
            if not isinstance(values, basestring) and hasattr(
                    values, "__iter__"):
                where_clause = Union()
                for value in values:
                    where_clause.append(order_terms("?s", attribute, value))
            else:
                where_clause = order_terms("?s", attribute, values)

            query.where(where_clause)

    if "filter" in params:
        filter_idx = 0
        for attribute, value, direct in params["filter"]:
            filter_idx += 1
            filter_variable = "?f%d" % filter_idx
            query.where(("?s", attribute, filter_variable))
            query.filter(value % filter_variable)

    if "order" in params:
        if params["order"]:
            # Order by subject URI
            if "desc" in params and params["desc"]:
                query.order_by("DESC(?s)")
            else:
                query.order_by("?s")
        else:
            # Match another variable, order by it
            query.optional_group(("?s", params["order"], "?o"))
            if "desc" in params and params["desc"]:
                query.order_by("DESC(?o)")
            else:
                query.order_by("?o")

    return query
Example #3
0
    def __apply_limit_offset_order_get_by_filter(self, params, query):
        """ Apply limit, offset, order parameters to query. """

        if "limit" in params:
            query.limit(params["limit"])

        if "offset" in params:
            query.offset(params["offset"])

        if "get_by" in params:
            for attribute, values, direct in params["get_by"]:
                if direct:
                    order_terms = lambda a, b, c: (a, b, c)
                else:
                    order_terms = lambda a, b, c: (c, b, a)

                if hasattr(values, "__iter__"):
                    where_clause = Union()
                    for value in values:
                        where_clause.append(order_terms(
                            "?s", attribute, value))
                else:
                    where_clause = order_terms("?s", attribute, values)

                query.where(where_clause)

        if "filter" in params:
            filter_idx = 0
            for attribute, value, direct in params["filter"]:
                filter_idx += 1
                filter_variable = "?f%d" % filter_idx
                query.where(("?s", attribute, filter_variable))
                query.filter(value % filter_variable)

        if "order" in params:
            if params["order"] == True:
                # Order by subject URI
                if "desc" in params and params["desc"]:
                    query.order_by("DESC(?s)")
                else:
                    query.order_by("?s")
            else:
                # Match another variable, order by it
                query.optional_group(("?s", params["order"], "?o"))
                if "desc" in params and params["desc"]:
                    query.order_by("DESC(?o)")
                else:
                    query.order_by("?o")

        return query
Example #4
0
    def __build_where_clause(cls, q_obj, edge_iterator):
        clauses = []
        for child in q_obj.children:
            if isinstance(child, Q):
                subclauses = cls.__build_where_clause(child, edge_iterator)
                connection = child.connection
            else:
                subclauses = cls.__build_attribute_clause(child, edge_iterator)
                connection = Q.AND

            if len(subclauses) > 1:
                if connection == Q.AND:
                    clause = Group(subclauses)
                elif connection == Q.OR:
                    clause = Union(subclauses)
            else:
                clause = subclauses[0]

            clauses.append(clause)

        return clauses
Example #5
0
    def __apply_limit_offset_order_get_by_filter(self, params, query):
        """ Apply limit, offset, order parameters to query. """
        def order_terms(a, b, c, direct):
            if direct:
                return (a, b, c)
            else:
                return (c, b, a)


        if "limit" in params:
            query.limit(params["limit"])

        if "offset" in params:
            query.offset(params["offset"])

        if "get_by" in params:
            edges = self.__edge_iterator()
            clauses = self.__build_where_clause(params["get_by"], edges)

            if params["get_by"].connection == Q.OR:
                query.where(Union(clauses))
            else:
                query.where(*clauses)

        if "filter" in params:
            filter_idx = 0
            for attribute, value, direct  in params["filter"]:
                filter_idx += 1
                filter_variable = "?f%d" % filter_idx
                query.where(("?s", attribute, filter_variable))
                query.filter(value % filter_variable)

        if "order" in params:
            if params["order"] == True:
                # Order by subject URI
                if "desc" in params and params["desc"]:
                    query.order_by("DESC(?s)")
                else:
                    query.order_by("?s")
            elif params["order"] != False:
                # Match another variable, order by it
                edges = params["order"]
                edge_idx = 0
                last_edge = "?s"
                where_clauses = []

                # Build path to attribute, value pair for which we sort
                for attribute, direct in edges:
                    edge_idx += 1
                    edge_variable = "?o%d" % edge_idx

                    where_clauses.append(order_terms(last_edge,
                                                     attribute,
                                                     edge_variable,
                                                     direct))
                    last_edge = edge_variable

                query.optional_group(*where_clauses)
                if "desc" in params and params["desc"]:
                    query.order_by("DESC(%s)" % last_edge)
                else:
                    query.order_by(last_edge)

        return query
Example #6
0
class RDFQueryReader(RDFReader):
    """ Super class for SuRF Reader plugins that wrap queryable `stores`. """

    def __init__(self, *args, **kwargs):
        RDFReader.__init__(self, *args, **kwargs)
        self.use_subqueries = kwargs.get('use_subqueries', False)
        if type(self.use_subqueries) in [str, tuple]:
            self.use_subqueries = (self.use_subqueries.lower() == 'true')
        elif type(self.use_subqueries) is not bool:
            raise ValueError('The use_subqueries parameter must be a bool or a string set to "true" or "false"')

    #protected interface
    def _get(self, subject, attribute, direct, query_contexts):
        query = query_SP(subject, attribute, direct, query_contexts)
        result = self._execute(query)
        return self.convert(result, 'v', 'g', 'c')

    def _load(self, subject, direct, query_contexts):
        query = query_S(subject, direct, query_contexts)
        result = self._execute(query)
        return self.convert(result, 'p', 'v', 'g', 'c')

    def _is_present(self, subject, query_contexts):
        query = query_Ask(subject, query_contexts)
        result = self._execute(query)
        return self._ask(result)

    def _concept(self, subject):
        query = query_Concept(subject)
        result = self._execute(query)
        return self.convert(result, 'c')

    def _instances_by_attribute(self, concept, attributes, direct, context):
        query = query_P_S(concept, attributes, direct, context)
        result = self._execute(query)
        return self.convert(result, 's', 'g', 'c')

    @classmethod
    def __edge_iterator(cls, edge='e'):
        edge_idx = 0
        while True:
            yield '?' + edge + str(edge_idx)
            edge_idx += 1

    @classmethod
    def __build_attribute_clause(cls, (edges, values), edge_iterator):
        def order_terms(a, b, c, direct):
            if direct:
                return (a, b, c)
            else:
                return (c, b, a)

        last_edge = "?s"
        clauses = []

        # Build path to attribute, value pair
        for attribute, direct in edges[:-1]:
            edge_variable = edge_iterator.next()

            clauses.append(order_terms(last_edge,
                                       attribute,
                                       edge_variable,
                                       direct))
            last_edge = edge_variable

        # Attach value query to path
        attribute, direct = edges[-1]
        if hasattr(values, "__iter__"):
            union_clause = Union()
            for value in values:
                union_clause.append(order_terms(last_edge,
                                                attribute,
                                                value,
                                                direct))
            clauses.append(union_clause)
        else:
            clauses.append(order_terms(last_edge,
                                       attribute,
                                       values,
                                       direct))
        return clauses