/* * Licensed to Crate under one or more contributor license agreements. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. Crate 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. * * However, if you have executed another commercial license agreement * with Crate these terms will supersede the license and you may use the * software solely pursuant to the terms of the relevant commercial * agreement. */ package io.crate.analyze.relations.select; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import io.crate.analyze.expressions.ExpressionAnalysisContext; import io.crate.analyze.expressions.ExpressionAnalyzer; import io.crate.analyze.relations.AnalyzedRelation; import io.crate.analyze.symbol.Symbol; import io.crate.metadata.Path; import io.crate.sql.tree.Expression; import io.crate.sql.tree.QualifiedName; import java.util.ArrayList; import java.util.List; import java.util.Map; public class SelectAnalysis { private final Map<QualifiedName, AnalyzedRelation> sources; private final ExpressionAnalyzer expressionAnalyzer; private final ExpressionAnalysisContext expressionAnalysisContext; private final List<Path> outputNames; private final List<Symbol> outputSymbols; private final Multimap<String, Symbol> outputMultiMap; SelectAnalysis(int expectedItems, Map<QualifiedName, AnalyzedRelation> sources, ExpressionAnalyzer expressionAnalyzer, ExpressionAnalysisContext expressionAnalysisContext) { this.sources = sources; this.expressionAnalyzer = expressionAnalyzer; this.expressionAnalysisContext = expressionAnalysisContext; outputMultiMap = HashMultimap.create(expectedItems, 1); outputNames = new ArrayList<>(expectedItems); outputSymbols = new ArrayList<>(expectedItems); } public List<Path> outputNames() { return outputNames; } public List<Symbol> outputSymbols() { return outputSymbols; } Symbol toSymbol(Expression expression) { return expressionAnalyzer.convert(expression, expressionAnalysisContext); } public Map<QualifiedName, AnalyzedRelation> sources() { return sources; } /** * multiMap containing outputNames() as keys and outputSymbols() as values. * Can be used to resolve expressions in ORDER BY or GROUP BY where it is important to know * if a outputName is unique */ public Multimap<String, Symbol> outputMultiMap() { return outputMultiMap; } void add(Path path, Symbol symbol) { outputNames.add(path); outputSymbols.add(symbol); outputMultiMap.put(path.outputName(), symbol); } }