package com.airbnb.airpal.core.execution; import com.airbnb.airpal.core.AirpalUser; import com.airbnb.airpal.core.AuthorizationUtil; import com.airbnb.airpal.presto.Table; import com.facebook.presto.sql.parser.SqlParser; import com.facebook.presto.sql.tree.Statement; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import java.util.List; import java.util.Set; import static com.airbnb.airpal.core.AuthorizationUtil.AuthorizedTablesPredicate; import static com.airbnb.airpal.core.execution.InputReferenceExtractor.CatalogSchemaContext; import static com.google.common.base.Preconditions.checkNotNull; public class QueryExecutionAuthorizer { private static final SqlParser SQL_PARSER = new SqlParser(); private final AirpalUser user; private final String defaultConnector; private final String defaultSchema; public QueryExecutionAuthorizer(AirpalUser user, String defaultConnector, String defaultSchema) { this.user = checkNotNull(user); this.defaultConnector = checkNotNull(defaultConnector); this.defaultSchema = checkNotNull(defaultSchema); } public boolean isAuthorizedWrite(String connectorId, String schema, String table) { return AuthorizationUtil.isAuthorizedWrite(user, connectorId, schema, table); } public boolean isAuthorizedRead(Set<Table> tables) { return Iterables.all(tables, new AuthorizedTablesPredicate(user)); } private static Splitter STATEMENT_SPLITTER = Splitter.on(";").omitEmptyStrings(); public static Set<Table> tablesUsedByQuery(String query, String defaultConnector, String defaultSchema) { List<String> statements = STATEMENT_SPLITTER.splitToList(query); ImmutableSet.Builder<Table> tables = ImmutableSet.builder(); CatalogSchemaContext context = new CatalogSchemaContext(defaultConnector, defaultSchema); for (String strStatement : statements) { InputReferenceExtractor extractor = new InputReferenceExtractor(); Statement statement = SQL_PARSER.createStatement(strStatement); context = statement.accept(extractor, context); tables.addAll(extractor.getReferences()); } return tables.build(); } public Set<Table> tablesUsedByQuery(String query) { return tablesUsedByQuery(query, defaultConnector, defaultSchema); } }