def collectAndRemoveFilters(parts): """ FILTER expressions apply to the whole group graph pattern in which they appear. http://www.w3.org/TR/sparql11-query/#sparqlCollectFilters """ filters = [] i = 0 while i < len(parts): p = parts[i] if p.name == 'Filter': filters.append(translateExists(p.expr)) parts.pop(i) else: i += 1 if filters: return and_(*filters) return None
def translate(q): """ http://www.w3.org/TR/sparql11-query/#convertSolMod """ #import pdb; pdb.set_trace() _traverse(q, _simplifyFilters) q.where = traverse(q.where, visitPost=translatePath) # TODO: Var scope test VS = set() traverse(q.where, functools.partial(_findVars, res=VS)) # all query types have a where part M = translateGroupGraphPattern(q.where) aggregate = False if q.groupby: conditions = [] # convert "GROUP BY (?expr as ?var)" to an Extend for c in q.groupby.condition: if isinstance(c, CompValue) and c.name == 'GroupAs': M = Extend(M, c.expr, c.var) c = c.var conditions.append(c) M = Group(p=M, expr=conditions) aggregate = True elif traverse(q.having, _hasAggregate, complete=False) or \ traverse(q.orderby, _hasAggregate, complete=False) or \ any(traverse(x, _hasAggregate, complete=False) for x in q.expr or []): # if any aggregate is used, implicit group by M = Group(p=M) aggregate = True if aggregate: M, E = translateAggregates(q, M) else: E = [] # HAVING if q.having: M = Filter(expr=and_(*q.having.condition), p=M) # VALUES if q.valuesClause: M = Join(p1=M, p2=ToMultiSet(translateValues(q.valuesClause))) if not q.var and not q.expr: # select * PV = list(VS) else: PV = list() if q.var: for v in q.var: if v not in PV: PV.append(v) if q.evar: for v in q.evar: if v not in PV: PV.append(v) E += zip(q.expr, q.evar) for e, v in E: M = Extend(M, e, v) # ORDER BY if q.orderby: M = OrderBy(M, [CompValue('OrderCondition', expr=c.expr, order=c.order) for c in q.orderby.condition]) # PROJECT M = Project(M, PV) if q.modifier: if q.modifier == 'DISTINCT': M = CompValue('Distinct', p=M) elif q.modifier == 'REDUCED': M = CompValue('Reduced', p=M) if q.limitoffset: offset = 0 if q.limitoffset.offset: offset = q.limitoffset.offset.toPython() if q.limitoffset.limit: M = CompValue('Slice', p=M, start=offset, length=q.limitoffset.limit.toPython()) else: M = CompValue('Slice', p=M, start=offset) return M, PV
def translate(q): """ http://www.w3.org/TR/sparql11-query/#convertSolMod """ # import pdb; pdb.set_trace() _traverse(q, _simplifyFilters) q.where = traverse(q.where, visitPost=translatePath) # TODO: Var scope test VS = set() traverse(q.where, functools.partial(_findVars, res=VS)) # all query types have a where part M = translateGroupGraphPattern(q.where) aggregate = False if q.groupby: conditions = [] # convert "GROUP BY (?expr as ?var)" to an Extend for c in q.groupby.condition: if isinstance(c, CompValue) and c.name == 'GroupAs': M = Extend(M, c.expr, c.var) c = c.var conditions.append(c) M = Group(p=M, expr=conditions) aggregate = True elif traverse(q.having, _hasAggregate, complete=False) or \ traverse(q.orderby, _hasAggregate, complete=False) or \ any(traverse(x, _hasAggregate, complete=False) for x in q.expr or []): # if any aggregate is used, implicit group by M = Group(p=M) aggregate = True if aggregate: M, E = translateAggregates(q, M) else: E = [] # HAVING if q.having: M = Filter(expr=and_(*q.having.condition), p=M) # VALUES if q.valuesClause: M = Join(p1=M, p2=ToMultiSet(translateValues(q.valuesClause))) if not q.var and not q.expr: # select * PV = list(VS) else: PV = list() if q.var: for v in q.var: if v not in PV: PV.append(v) if q.evar: for v in q.evar: if v not in PV: PV.append(v) E += zip(q.expr, q.evar) for e, v in E: M = Extend(M, e, v) # ORDER BY if q.orderby: M = OrderBy(M, [CompValue('OrderCondition', expr=c.expr, order=c.order) for c in q.orderby.condition]) # PROJECT M = Project(M, PV) if q.modifier: if q.modifier == 'DISTINCT': M = CompValue('Distinct', p=M) elif q.modifier == 'REDUCED': M = CompValue('Reduced', p=M) if q.limitoffset: offset = 0 if q.limitoffset.offset!=None: offset = q.limitoffset.offset.toPython() if q.limitoffset.limit!=None: M = CompValue('Slice', p=M, start=offset, length=q.limitoffset.limit.toPython()) else: M = CompValue('Slice', p=M, start=offset) return M, PV