/* * 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 * * 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. */ package org.apache.cassandra.cql3.selection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.common.base.Function; import com.google.common.collect.Lists; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.selection.Selector.Factory; import org.apache.cassandra.exceptions.InvalidRequestException; /** * A set of Selector factories. */ final class SelectorFactories implements Iterable { /** * The Selector factories. */ private final List factories; /** * true if one of the factory creates writetime selectors. */ private boolean containsWritetimeFactory; /** * true if one of the factory creates TTL selectors. */ private boolean containsTTLFactory; /** * The number of factories creating aggregates. */ private int numberOfAggregateFactories; /** * Creates a new SelectorFactories instance and collect the column definitions. * * @param selectables the Selectables for which the factories must be created * @param cfm the Column Family Definition * @param defs the collector parameter for the column definitions * @return a new SelectorFactories instance * @throws InvalidRequestException if a problem occurs while creating the factories */ public static SelectorFactories createFactoriesAndCollectColumnDefinitions(List selectables, CFMetaData cfm, List defs) throws InvalidRequestException { return new SelectorFactories(selectables, cfm, defs); } private SelectorFactories(List selectables, CFMetaData cfm, List defs) throws InvalidRequestException { factories = new ArrayList<>(selectables.size()); for (Selectable selectable : selectables) { Factory factory = selectable.newSelectorFactory(cfm, defs); containsWritetimeFactory |= factory.isWritetimeSelectorFactory(); containsTTLFactory |= factory.isTTLSelectorFactory(); if (factory.isAggregateSelectorFactory()) ++numberOfAggregateFactories; factories.add(factory); } } public boolean usesFunction(String ksName, String functionName) { for (Factory factory : factories) if (factory != null && factory.usesFunction(ksName, functionName)) return true; return false; } /** * Adds a new Selector.Factory for a column that is needed only for ORDER BY purposes. * @param def the column that is needed for ordering * @param index the index of the column definition in the Selection's list of columns */ public void addSelectorForOrdering(ColumnDefinition def, int index) { factories.add(SimpleSelector.newFactory(def.name.toString(), index, def.type)); } /** * Checks if this SelectorFactories contains only factories for aggregates. * * @return true if this SelectorFactories contains only factories for aggregates, * false otherwise. */ public boolean containsOnlyAggregateFunctions() { int size = factories.size(); return size != 0 && numberOfAggregateFactories == size; } /** * Whether the selector built by this factory does aggregation or not (either directly or in a sub-selector). * * @return true if the selector built by this factor does aggregation, false otherwise. */ public boolean doesAggregation() { return numberOfAggregateFactories > 0; } /** * Checks if this SelectorFactories contains at least one factory for writetime selectors. * * @return true if this SelectorFactories contains at least one factory for writetime * selectors, false otherwise. */ public boolean containsWritetimeSelectorFactory() { return containsWritetimeFactory; } /** * Checks if this SelectorFactories contains at least one factory for TTL selectors. * * @return true if this SelectorFactories contains at least one factory for TTL * selectors, false otherwise. */ public boolean containsTTLSelectorFactory() { return containsTTLFactory; } /** * Creates a list of new Selector instances. * @return a list of new Selector instances. */ public List newInstances() throws InvalidRequestException { List selectors = new ArrayList<>(factories.size()); for (Selector.Factory factory : factories) { selectors.add(factory.newInstance()); } return selectors; } public Iterator iterator() { return factories.iterator(); } /** * Returns the names of the columns corresponding to the output values of the selector instances created by * these factories. * * @return a list of column names */ public List getColumnNames() { return Lists.transform(factories, new Function() { public String apply(Selector.Factory factory) { return factory.getColumnName(); } }); } }