All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.aerospike.jdbc.query.AerospikeQueryParser Maven / Gradle / Ivy

package com.aerospike.jdbc.query;

import com.aerospike.jdbc.model.AerospikeQuery;
import com.aerospike.jdbc.model.OrderByExpression;
import com.aerospike.jdbc.model.QueryType;
import com.aerospike.jdbc.util.IOUtils;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import io.prestosql.sql.ExpressionFormatter;
import io.prestosql.sql.tree.*;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

public final class AerospikeQueryParser {

    private AerospikeQueryParser() {
    }

    public static AerospikeQuery parseSql(Node root) {
        AerospikeQuery query = new AerospikeQuery();
        (new QueryParser(query)).process(root, 0);
        return query;
    }

    static String formatName(QualifiedName name) {
        return name.getOriginalParts().stream().map(AerospikeExpressionParser::formatExpression)
                .collect(Collectors.joining("."));
    }

    private static void appendAliasColumns(StringBuilder builder, List columns) {
        if (columns != null && !columns.isEmpty()) {
            String formattedColumns = columns.stream().map(AerospikeExpressionParser::formatExpression)
                    .collect(Collectors.joining(", "));
            builder.append(" (").append(formattedColumns).append(')');
        }
    }

    private static class QueryParser extends AstVisitor {
        private final AerospikeQuery query;

        public QueryParser(AerospikeQuery query) {
            this.query = query;
        }

        protected Void visitNode(Node node, Integer indent) {
            throw new UnsupportedOperationException("not yet implemented: " + node);
        }

        protected Void visitExpression(Expression node, Integer indent) {
            Preconditions.checkArgument(indent == 0, "visitExpression should only be called at root");
            ExpressionFormatter.formatExpression(node);
            return null;
        }

        protected Void visitUnnest(Unnest node, Integer indent) {
            throw new UnsupportedOperationException("visitUnnest");
        }

        protected Void visitLateral(Lateral node, Integer indent) {
            throw new UnsupportedOperationException("visitLateral");
        }

        protected Void visitPrepare(Prepare node, Integer indent) {
            throw new UnsupportedOperationException("visitPrepare");
        }

        protected Void visitDeallocate(Deallocate node, Integer indent) {
            throw new UnsupportedOperationException("visitDeallocate");
        }

        protected Void visitExecute(Execute node, Integer indent) {
            throw new UnsupportedOperationException("visitExecute");
        }

        protected Void visitDescribeOutput(DescribeOutput node, Integer indent) {
            throw new UnsupportedOperationException("visitDescribeOutput");
        }

        protected Void visitDescribeInput(DescribeInput node, Integer indent) {
            throw new UnsupportedOperationException("visitDescribeInput");
        }

        protected Void visitQuery(Query node, Integer indent) {
            if (node.getWith().isPresent()) {
                throw new UnsupportedOperationException("WITH");
            }

            this.processRelation(node.getQueryBody(), indent);

            if (node.getOrderBy().isPresent()) {
                this.process(node.getOrderBy().get(), indent);
            }

            if (node.getOffset().isPresent()) {
                this.process(node.getOffset().get(), indent);
            }

            if (node.getLimit().isPresent()) {
                this.process(node.getLimit().get(), indent);
            }

            return null;
        }

        private void processRelation(Relation relation, Integer indent) {
            if (relation instanceof Table) {
                query.setTable(((Table) relation).getName().toString());
            } else {
                this.process(relation, indent);
            }
        }

        protected Void visitQuerySpecification(QuerySpecification node, Integer indent) {
            this.process(node.getSelect(), indent);
            if (node.getFrom().isPresent()) {
                this.process(node.getFrom().get(), indent);
            }

            if (node.getWhere().isPresent()) {
                query.setWhere(AerospikeWhereParser.parseExpression(node.getWhere().get()));
            }

            if (node.getGroupBy().isPresent()) {
                throw new UnsupportedOperationException("GROUP BY");
            }

            if (node.getHaving().isPresent()) {
                throw new UnsupportedOperationException("HAVING");
            }

            if (node.getOrderBy().isPresent()) {
                this.process(node.getOrderBy().get(), indent);
            }

            if (node.getOffset().isPresent()) {
                this.process(node.getOffset().get(), indent);
            }

            if (node.getLimit().isPresent()) {
                this.process(node.getLimit().get(), indent);
            }

            return null;
        }

        protected Void visitOrderBy(OrderBy node, Integer indent) {
            node.getSortItems().forEach(input -> {
                OrderByExpression orderBy = new OrderByExpression();
                orderBy.setColumns(Arrays.asList(AerospikeExpressionParser.formatExpression(input.getSortKey())
                        .split(",").clone()));
                switch (input.getOrdering()) {
                    case ASCENDING:
                        orderBy.setOrdering(OrderByExpression.Ordering.ASC);
                        break;
                    case DESCENDING:
                        orderBy.setOrdering(OrderByExpression.Ordering.DESC);
                        break;
                    default:
                        throw new UnsupportedOperationException("unknown ordering: " + input.getOrdering());
                }
                query.appendOrderBy(orderBy);
            });
            return null;
        }

        protected Void visitOffset(Offset node, Integer indent) {
            query.setOffset(Integer.parseInt(AerospikeExpressionParser.formatExpression(node.getRowCount())));
            return null;
        }

        protected Void visitFetchFirst(FetchFirst node, Integer indent) {
            throw new UnsupportedOperationException("visitFetchFirst");
        }

        protected Void visitLimit(Limit node, Integer indent) {
            query.setLimit(Integer.parseInt(AerospikeExpressionParser.formatExpression(node.getRowCount())));
            return null;
        }

        protected Void visitSelect(Select node, Integer indent) {
            query.setType(QueryType.SELECT);
            if (node.isDistinct()) {
                query.setDistinct(true);
            }

            if (node.getSelectItems().size() > 1) {
                for (SelectItem item : node.getSelectItems()) {
                    query.appendColumns(indentString(indent));
                    this.process(item, indent);
                }
            } else {
                this.process(Iterables.getOnlyElement(node.getSelectItems()), indent);
            }

            return null;
        }

        protected Void visitSingleColumn(SingleColumn node, Integer indent) {
            query.appendColumns(ExpressionFormatter.formatExpression(node.getExpression()));
            return null;
        }

        protected Void visitAllColumns(AllColumns node, Integer context) {
            node.getTarget().ifPresent((value) -> {
                query.setTable(ExpressionFormatter.formatExpression(value));
            });
            query.appendColumns("*");
            return null;
        }

        protected Void visitTable(Table node, Integer indent) {
            query.setTable(AerospikeQueryParser.formatName(node.getName()));
            return null;
        }

        protected Void visitJoin(Join node, Integer indent) {
            throw new UnsupportedOperationException("visitJoin");
        }

        protected Void visitAliasedRelation(AliasedRelation node, Integer indent) {
            throw new UnsupportedOperationException("visitAliasedRelation");
        }

        protected Void visitSampledRelation(SampledRelation node, Integer indent) {
            throw new UnsupportedOperationException("visitSampledRelation");
        }

        protected Void visitValues(Values node, Integer indent) {
            boolean first = true;
            StringBuilder builder = new StringBuilder();
            for (Iterator var4 = node.getRows().iterator(); var4.hasNext(); first = false) {
                Expression row = (Expression) var4.next();
                builder.append(indentString(indent)).append(first ? "  " : ", ");
                builder.append(AerospikeExpressionParser.formatExpression(row));
            }

            query.setValues(Arrays.stream(builder.toString().split(",")).map(String::trim).distinct()
                    .collect(Collectors.toList()));
            return null;
        }

        protected Void visitTableSubquery(TableSubquery node, Integer indent) {
            throw new UnsupportedOperationException("visitTableSubquery");
        }

        protected Void visitUnion(Union node, Integer indent) {
            throw new UnsupportedOperationException("visitUnion");
        }

        protected Void visitExcept(Except node, Integer indent) {
            throw new UnsupportedOperationException("visitExcept");
        }

        protected Void visitIntersect(Intersect node, Integer indent) {
            throw new UnsupportedOperationException("visitIntersect");
        }

        protected Void visitCreateView(CreateView node, Integer indent) {
            throw new UnsupportedOperationException("visitCreateView");
        }

        protected Void visitRenameView(RenameView node, Integer context) {
            throw new UnsupportedOperationException("visitRenameView");
        }

        protected Void visitSetViewAuthorization(SetViewAuthorization node, Integer context) {
            throw new UnsupportedOperationException("visitSetViewAuthorization");
        }

        protected Void visitCreateMaterializedView(CreateMaterializedView node, Integer indent) {
            throw new UnsupportedOperationException("visitCreateMaterializedView");
        }

        protected Void visitRefreshMaterializedView(RefreshMaterializedView node, Integer context) {
            throw new UnsupportedOperationException("visitRefreshMaterializedView");
        }

        protected Void visitDropMaterializedView(DropMaterializedView node, Integer context) {
            throw new UnsupportedOperationException("visitDropMaterializedView");
        }

        protected Void visitDropView(DropView node, Integer context) {
            throw new UnsupportedOperationException("visitDropView");
        }

        protected Void visitExplain(Explain node, Integer indent) {
            throw new UnsupportedOperationException("visitExplain");
        }

        protected Void visitShowCatalogs(ShowCatalogs node, Integer context) {
            query.setType(QueryType.SHOW_CATALOGS);
            node.getLikePattern().ifPresent((value) -> query.setLike(AerospikeExpressionParser.formatStringLiteral(value)));
            node.getEscape().ifPresent((value) -> query.setEscape(AerospikeExpressionParser.formatStringLiteral(value)));
            return null;
        }

        protected Void visitShowSchemas(ShowSchemas node, Integer context) {
            query.setType(QueryType.SHOW_SCHEMAS);
            if (node.getCatalog().isPresent()) {
                query.setCatalog(node.getCatalog().get().toString());
            }
            node.getLikePattern().ifPresent((value) -> query.setLike(AerospikeExpressionParser.formatStringLiteral(value)));
            node.getEscape().ifPresent((value) -> query.setEscape(AerospikeExpressionParser.formatStringLiteral(value)));
            return null;
        }

        protected Void visitShowTables(ShowTables node, Integer context) {
            query.setType(QueryType.SHOW_TABLES);
            node.getSchema().ifPresent((value) -> query.setSchema(AerospikeQueryParser.formatName(value)));
            node.getLikePattern().ifPresent((value) -> query.setLike(AerospikeExpressionParser.formatStringLiteral(value)));
            node.getEscape().ifPresent((value) -> query.setEscape(AerospikeExpressionParser.formatStringLiteral(value)));
            return null;
        }

        protected Void visitShowCreate(ShowCreate node, Integer context) {
            throw new UnsupportedOperationException("visitShowCreate");
        }

        protected Void visitShowColumns(ShowColumns node, Integer context) {
            query.setType(QueryType.SHOW_COLUMNS);
            query.setTable(AerospikeQueryParser.formatName(node.getTable()));
            node.getLikePattern().ifPresent((value) -> query.setLike(AerospikeExpressionParser.formatStringLiteral(value)));
            node.getEscape().ifPresent((value) -> query.setEscape(AerospikeExpressionParser.formatStringLiteral(value)));
            return null;
        }

        protected Void visitShowStats(ShowStats node, Integer context) {
            throw new UnsupportedOperationException("visitShowStats");
        }

        protected Void visitShowFunctions(ShowFunctions node, Integer context) {
            throw new UnsupportedOperationException("visitShowFunctions");
        }

        protected Void visitShowSession(ShowSession node, Integer context) {
            throw new UnsupportedOperationException("visitShowSession");
        }

        protected Void visitDelete(Delete node, Integer context) {
            query.setType(QueryType.DELETE);
            query.setTable(AerospikeQueryParser.formatName(node.getTable().getName()));
            if (node.getWhere().isPresent()) {
                query.setWhere(AerospikeWhereParser.parseExpression(node.getWhere().get()));
            }
            return null;
        }

        protected Void visitCreateSchema(CreateSchema node, Integer context) {
            throw new UnsupportedOperationException("visitCreateSchema");
        }

        protected Void visitDropSchema(DropSchema node, Integer context) {
            query.setType(QueryType.DROP_SCHEMA);
            return null;
        }

        protected Void visitRenameSchema(RenameSchema node, Integer context) {
            throw new UnsupportedOperationException("visitRenameSchema");
        }

        protected Void visitSetSchemaAuthorization(SetSchemaAuthorization node, Integer context) {
            throw new UnsupportedOperationException("visitSetSchemaAuthorization");
        }

        protected Void visitCreateTableAsSelect(CreateTableAsSelect node, Integer indent) {
            throw new UnsupportedOperationException("visitCreateTableAsSelect");
        }

        protected Void visitCreateTable(CreateTable node, Integer indent) {
            throw new UnsupportedOperationException("visitCreateTable");
        }

        protected Void visitDropTable(DropTable node, Integer context) {
            query.setType(QueryType.DROP_TABLE);
            query.setTable(node.getTableName().toString());
            return null;
        }

        protected Void visitRenameTable(RenameTable node, Integer context) {
            throw new UnsupportedOperationException("visitRenameTable");
        }

        protected Void visitComment(Comment node, Integer context) {
            throw new UnsupportedOperationException("visitComment");
        }

        protected Void visitRenameColumn(RenameColumn node, Integer context) {
            throw new UnsupportedOperationException("visitRenameColumn");
        }

        protected Void visitDropColumn(DropColumn node, Integer context) {
            throw new UnsupportedOperationException("visitDropColumn");
        }

        protected Void visitAnalyze(Analyze node, Integer context) {
            throw new UnsupportedOperationException("visitAnalyze");
        }

        protected Void visitAddColumn(AddColumn node, Integer indent) {
            throw new UnsupportedOperationException("visitAddColumn");
        }

        protected Void visitSetTableAuthorization(SetTableAuthorization node, Integer context) {
            throw new UnsupportedOperationException("visitSetTableAuthorization");
        }

        protected Void visitInsert(Insert node, Integer indent) {
            query.setType(QueryType.INSERT);
            query.setTable(AerospikeQueryParser.formatName(node.getTarget()));
            if (node.getColumns().isPresent()) {
                query.setColumns(node.getColumns().get().stream().map(Object::toString).map(IOUtils::stripQuotes)
                        .collect(Collectors.toList()));
            }

            this.process(node.getQuery(), indent); // ?
            return null;
        }

        public Void visitSetSession(SetSession node, Integer context) {
            throw new UnsupportedOperationException("visitSetSession");
        }

        public Void visitResetSession(ResetSession node, Integer context) {
            throw new UnsupportedOperationException("visitResetSession");
        }

        protected Void visitCallArgument(CallArgument node, Integer indent) {
            throw new UnsupportedOperationException("visitCallArgument");
        }

        protected Void visitCall(Call node, Integer indent) {
            throw new UnsupportedOperationException("visitCall");
        }

        protected Void visitRow(Row node, Integer indent) {
            throw new UnsupportedOperationException("visitRow");
        }

        protected Void visitStartTransaction(StartTransaction node, Integer indent) {
            throw new UnsupportedOperationException("visitStartTransaction");
        }

        protected Void visitIsolationLevel(Isolation node, Integer indent) {
            throw new UnsupportedOperationException("visitIsolationLevel");
        }

        protected Void visitTransactionAccessMode(TransactionAccessMode node, Integer context) {
            throw new UnsupportedOperationException("visitTransactionAccessMode");
        }

        protected Void visitCommit(Commit node, Integer context) {
            throw new UnsupportedOperationException("visitCommit");
        }

        protected Void visitRollback(Rollback node, Integer context) {
            throw new UnsupportedOperationException("visitRollback");
        }

        protected Void visitCreateRole(CreateRole node, Integer context) {
            throw new UnsupportedOperationException("visitCreateRole");
        }

        protected Void visitDropRole(DropRole node, Integer context) {
            throw new UnsupportedOperationException("visitDropRole");
        }

        protected Void visitGrantRoles(GrantRoles node, Integer context) {
            throw new UnsupportedOperationException("visitGrantRoles");
        }

        protected Void visitRevokeRoles(RevokeRoles node, Integer context) {
            throw new UnsupportedOperationException("visitRevokeRoles");
        }

        protected Void visitSetRole(SetRole node, Integer context) {
            throw new UnsupportedOperationException("visitSetRole");
        }

        public Void visitGrant(Grant node, Integer indent) {
            throw new UnsupportedOperationException("visitGrant");
        }

        public Void visitRevoke(Revoke node, Integer indent) {
            throw new UnsupportedOperationException("visitRevoke");
        }

        public Void visitShowGrants(ShowGrants node, Integer indent) {
            throw new UnsupportedOperationException("visitShowGrants");
        }

        protected Void visitShowRoles(ShowRoles node, Integer context) {
            throw new UnsupportedOperationException("visitShowRoles");
        }

        protected Void visitShowRoleGrants(ShowRoleGrants node, Integer context) {
            throw new UnsupportedOperationException("visitShowRoleGrants");
        }

        public Void visitSetPath(SetPath node, Integer indent) {
            throw new UnsupportedOperationException("visitSetPath");
        }

        private static String indentString(int indent) {
            return Strings.repeat("   ", indent);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy