blob: a2c6b983cb5ef757e162856956c78298b0038f10 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.atlas.query;
import org.apache.atlas.query.antlr4.AtlasDSLParser.*;
import org.apache.atlas.query.antlr4.AtlasDSLParserBaseVisitor;
import org.apache.commons.collections.CollectionUtils;
public class DSLVisitor extends AtlasDSLParserBaseVisitor<String> {
private final QueryProcessor queryProcessor;
public DSLVisitor(QueryProcessor queryProcessor) {
this.queryProcessor = queryProcessor;
}
@Override
public String visitFromExpression(final FromExpressionContext ctx) {
FromSrcContext fromSrc = ctx.fromSrc();
AliasExprContext aliasExpr = fromSrc.aliasExpr();
if (aliasExpr != null) {
queryProcessor.addFromAlias(aliasExpr.identifier(0).getText(), aliasExpr.identifier(1).getText());
} else {
if (fromSrc.identifier() != null) {
queryProcessor.addFrom(fromSrc.identifier().getText());
} else {
queryProcessor.addFrom(fromSrc.literal().getText());
}
}
return super.visitFromExpression(ctx);
}
@Override
public String visitWhereClause(WhereClauseContext ctx) {
ExprContext expr = ctx.expr();
processExpr(expr.compE());
if (CollectionUtils.isNotEmpty(expr.exprRight())) {
for (ExprRightContext exprRight : expr.exprRight()) {
if (exprRight.K_AND() != null) {
// AND expression
processExpr(exprRight.compE());
}
// OR is tricky
}
}
return super.visitWhereClause(ctx);
}
private void processExpr(final CompEContext compE) {
if (compE != null && compE.isClause() == null && compE.hasClause() == null && compE.isClause() == null) {
ComparisonClauseContext comparisonClause = compE.comparisonClause();
if(comparisonClause == null) {
comparisonClause = compE.arithE().multiE().atomE().expr().compE().comparisonClause();
}
if (comparisonClause != null) {
String lhs = comparisonClause.arithE(0).getText();
String op = comparisonClause.operator().getText().toUpperCase();
String rhs = comparisonClause.arithE(1).getText();
queryProcessor.addWhere(lhs, op, rhs);
}
}
}
@Override
public String visitSelectExpr(SelectExprContext ctx) {
if (!(ctx.getParent() instanceof GroupByExpressionContext)) {
String[] items = new String[ctx.selectExpression().size()];
for (int i = 0; i < ctx.selectExpression().size(); i++) {
items[i] = ctx.selectExpression(i).expr().getText();
}
queryProcessor.addSelect(items);
}
return super.visitSelectExpr(ctx);
}
@Override
public String visitLimitOffset(LimitOffsetContext ctx) {
queryProcessor.addLimit(ctx.limitClause().NUMBER().toString(),
(ctx.offsetClause() == null ? "0" : ctx.offsetClause().NUMBER().getText()));
return super.visitLimitOffset(ctx);
}
@Override
public String visitOrderByExpr(OrderByExprContext ctx) {
queryProcessor.addOrderBy(ctx.expr().getText(), (ctx.sortOrder() != null && ctx.sortOrder().getText().equalsIgnoreCase("desc")));
return super.visitOrderByExpr(ctx);
}
@Override
public String visitIsClause(IsClauseContext ctx) {
queryProcessor.addFromIsA(ctx.arithE().getText(), ctx.identifier().getText());
return super.visitIsClause(ctx);
}
@Override
public String visitHasClause(HasClauseContext ctx) {
queryProcessor.addFromProperty(ctx.arithE().getText(), ctx.identifier().getText());
return super.visitHasClause(ctx);
}
@Override
public String visitGroupByExpression(GroupByExpressionContext ctx) {
String s = ctx.selectExpr().getText();
queryProcessor.addGroupBy(s);
return super.visitGroupByExpression(ctx);
}
}