blob: 4c1743787be0d50d46489694a77be0804485185c [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
*
* 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.druid.segment;
import org.apache.druid.query.dimension.ColumnSelectorStrategyFactory;
import org.apache.druid.segment.column.ValueType;
/**
* Class that encapsulates knowledge about how to create "column processors", which are... objects that process columns
* and want to have type-specific logic. Used by {@link ColumnProcessors#makeProcessor}.
*
* Column processors can be any type "T". The idea is that a ColumnProcessorFactory embodies the logic for wrapping
* and processing selectors of various types, and so enables nice code design, where type-dependent code is not
* sprinkled throughout.
*
* @see VectorColumnProcessorFactory the vectorized version
* @see ColumnProcessors#makeProcessor which uses these, and which is responsible for
* determining which type of selector to use for a given column
* @see ColumnSelectorStrategyFactory which serves a similar purpose and may be replaced by this in the future
* @see DimensionHandlerUtils#createColumnSelectorPluses which accepts {@link ColumnSelectorStrategyFactory} and is
* similar to {@link ColumnProcessors#makeProcessor}
*/
public interface ColumnProcessorFactory<T>
{
/**
* This default type will be used when the underlying column has an unknown type.
*
* This allows a column processor factory to specify what type it prefers to deal with (the most 'natural' type for
* whatever it is doing) when all else is equal.
*/
ValueType defaultType();
/**
* Create a processor for a string column.
*
* @param selector dimension selector
* @param multiValue whether the selector *might* have multiple values
*/
T makeDimensionProcessor(DimensionSelector selector, boolean multiValue);
/**
* Create a processor for a float column.
*
* @param selector float selector
*/
T makeFloatProcessor(BaseFloatColumnValueSelector selector);
/**
* Create a processor for a double column.
*
* @param selector double selector
*/
T makeDoubleProcessor(BaseDoubleColumnValueSelector selector);
/**
* Create a processor for a long column.
*
* @param selector long selector
*/
T makeLongProcessor(BaseLongColumnValueSelector selector);
/**
* Create a processor for a complex column.
*
* @param selector object selector
*/
T makeComplexProcessor(BaseObjectColumnValueSelector<?> selector);
}