/** * @return iterator over match results */ @Override @CheckReturnValue default Iterator<ConceptMap> iterator() { return stream().iterator(); }
@Override public Stream<ConceptMap> run(GetQuery query) { return query.match().stream().map(result -> result.project(query.vars())).distinct(); }
@Override public <T extends Answer> Stream<T> run(AggregateQuery<T> query) { return query.aggregate().apply(query.match().stream()).stream(); }
@Override public Stream<ConceptSet> run(DeleteQuery query) { Stream<ConceptMap> answers = query.admin().match().stream().map(result -> result.project(query.admin().vars())).distinct(); // TODO: We should not need to collect toSet, once we fix ConceptId.id() to not use cache. // Stream.distinct() will then work properly when it calls ConceptImpl.equals() Set<Concept> conceptsToDelete = answers.flatMap(answer -> answer.concepts().stream()).collect(toSet()); conceptsToDelete.forEach(concept -> { if (concept.isSchemaConcept()) { throw GraqlQueryException.deleteSchemaConcept(concept.asSchemaConcept()); } concept.delete(); }); // TODO: return deleted Concepts instead of ConceptIds return Stream.of(new ConceptSet(conceptsToDelete.stream().map(Concept::id).collect(toSet()))); }
Stream<ConceptMap> answerStream = conjQuery.isRuleResolvable() ? conjQuery.resolve() : embeddedTx.graql().infer(false).match(conj).stream(); while (conjIt.hasNext()) { conj = conjIt.next(); conjQuery = ReasonerQueries.create(conj, embeddedTx).rewrite(); Stream<ConceptMap> localStream = conjQuery.isRuleResolvable() ? conjQuery.resolve() : embeddedTx.graql().infer(false).match(conj).stream(); answerStream = Stream.concat(answerStream, localStream);