
io.mindmaps.graql.internal.parser.QueryVisitor Maven / Gradle / Ivy
/*
* MindmapsDB - A Distributed Semantic Database
* Copyright (C) 2016 Mindmaps Research Ltd
*
* MindmapsDB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MindmapsDB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MindmapsDB. If not, see .
*/
package io.mindmaps.graql.internal.parser;
import com.google.common.collect.ImmutableMap;
import io.mindmaps.concept.ResourceType;
import io.mindmaps.graql.Aggregate;
import io.mindmaps.graql.AggregateQuery;
import io.mindmaps.graql.AskQuery;
import io.mindmaps.graql.ComputeQuery;
import io.mindmaps.graql.DeleteQuery;
import io.mindmaps.graql.Graql;
import io.mindmaps.graql.InsertQuery;
import io.mindmaps.graql.MatchQuery;
import io.mindmaps.graql.NamedAggregate;
import io.mindmaps.graql.Pattern;
import io.mindmaps.graql.Query;
import io.mindmaps.graql.QueryBuilder;
import io.mindmaps.graql.ValuePredicate;
import io.mindmaps.graql.Var;
import io.mindmaps.graql.internal.antlr.GraqlBaseVisitor;
import io.mindmaps.graql.internal.antlr.GraqlParser;
import io.mindmaps.graql.internal.util.StringConverter;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.TerminalNode;
import java.util.*;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;
import static io.mindmaps.graql.Graql.id;
import static io.mindmaps.graql.Graql.var;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
/**
* ANTLR visitor class for parsing a query
*/
// This class performs a lot of unchecked casts, because ANTLR's visit methods only return 'object'
@SuppressWarnings("unchecked")
class QueryVisitor extends GraqlBaseVisitor {
private final QueryBuilder queryBuilder;
private final ImmutableMap, Aggregate>> aggregateMethods;
QueryVisitor(
ImmutableMap, Aggregate>> aggregateMethods, QueryBuilder queryBuilder) {
this.aggregateMethods = aggregateMethods;
this.queryBuilder = queryBuilder;
}
@Override
public Query> visitQueryEOF(GraqlParser.QueryEOFContext ctx) {
return (Query>) visitQuery(ctx.query());
}
@Override
public MatchQuery visitMatchEOF(GraqlParser.MatchEOFContext ctx) {
return visitMatchQuery(ctx.matchQuery());
}
@Override
public AskQuery visitAskEOF(GraqlParser.AskEOFContext ctx) {
return visitAskQuery(ctx.askQuery());
}
@Override
public InsertQuery visitInsertEOF(GraqlParser.InsertEOFContext ctx) {
return visitInsertQuery(ctx.insertQuery());
}
@Override
public DeleteQuery visitDeleteEOF(GraqlParser.DeleteEOFContext ctx) {
return visitDeleteQuery(ctx.deleteQuery());
}
@Override
public ComputeQuery visitComputeEOF(GraqlParser.ComputeEOFContext ctx) {
return visitComputeQuery(ctx.computeQuery());
}
@Override
public MatchQuery visitMatchBase(GraqlParser.MatchBaseContext ctx) {
Collection patterns = visitPatterns(ctx.patterns());
return queryBuilder.match(patterns);
}
@Override
public MatchQuery visitMatchSelect(GraqlParser.MatchSelectContext ctx) {
Set names = ctx.VARIABLE().stream().map(this::getVariable).collect(toSet());
return visitMatchQuery(ctx.matchQuery()).select(names);
}
@Override
public MatchQuery visitMatchOffset(GraqlParser.MatchOffsetContext ctx) {
return visitMatchQuery(ctx.matchQuery()).offset(getInteger(ctx.INTEGER()));
}
@Override
public MatchQuery visitMatchOrderBy(GraqlParser.MatchOrderByContext ctx) {
MatchQuery matchQuery = visitMatchQuery(ctx.matchQuery());
// decide which ordering method to use
String var = getVariable(ctx.VARIABLE());
if (ctx.ORDER() != null) {
return matchQuery.orderBy(var, getOrder(ctx.ORDER()));
} else {
return matchQuery.orderBy(var);
}
}
@Override
public MatchQuery visitMatchLimit(GraqlParser.MatchLimitContext ctx) {
return visitMatchQuery(ctx.matchQuery()).limit(getInteger(ctx.INTEGER()));
}
@Override
public MatchQuery visitMatchDistinct(GraqlParser.MatchDistinctContext ctx) {
return visitMatchQuery(ctx.matchQuery()).distinct();
}
@Override
public AggregateQuery> visitAggregateEOF(GraqlParser.AggregateEOFContext ctx) {
return visitAggregateQuery(ctx.aggregateQuery());
}
@Override
public AskQuery visitAskQuery(GraqlParser.AskQueryContext ctx) {
return visitMatchQuery(ctx.matchQuery()).ask();
}
@Override
public InsertQuery visitInsertQuery(GraqlParser.InsertQueryContext ctx) {
Collection vars = visitVarPatterns(ctx.varPatterns());
if (ctx.matchQuery() != null) {
return visitMatchQuery(ctx.matchQuery()).insert(vars);
} else {
return queryBuilder.insert(vars);
}
}
@Override
public DeleteQuery visitDeleteQuery(GraqlParser.DeleteQueryContext ctx) {
Collection getters = visitVarPatterns(ctx.varPatterns());
return visitMatchQuery(ctx.matchQuery()).delete(getters);
}
@Override
public ComputeQuery visitComputeQuery(GraqlParser.ComputeQueryContext ctx) {
// TODO: Allow registering additional compute methods
String computeMethod = visitId(ctx.id());
Set statisticsResourceTypeIds = new HashSet<>(), subTypeIds = new HashSet<>();
if (ctx.subgraph() != null) {
subTypeIds = visitSubgraph(ctx.subgraph());
}
if (ctx.statTypes() != null) {
statisticsResourceTypeIds = visitStatTypes(ctx.statTypes());
}
return queryBuilder.compute(computeMethod, subTypeIds, statisticsResourceTypeIds);
}
@Override
public Set visitStatTypes(GraqlParser.StatTypesContext ctx) {
return visitIdList(ctx.idList());
}
@Override
public Set visitSubgraph(GraqlParser.SubgraphContext ctx) {
return visitIdList(ctx.idList());
}
@Override
public Set visitIdList(GraqlParser.IdListContext ctx) {
return ctx.id().stream().map(this::visitId).collect(toSet());
}
@Override
public AggregateQuery> visitAggregateQuery(GraqlParser.AggregateQueryContext ctx) {
Aggregate aggregate = visitAggregate(ctx.aggregate());
return visitMatchQuery(ctx.matchQuery()).aggregate(aggregate);
}
@Override
public Aggregate, ?> visitCustomAgg(GraqlParser.CustomAggContext ctx) {
String name = visitId(ctx.id());
Function, Aggregate> aggregateMethod = aggregateMethods.get(name);
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy