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

org.apache.druid.segment.ColumnProcessorFactory Maven / Gradle / Ivy

There is a newer version: 30.0.1
Show newest version
/*
 * 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.ColumnCapabilities;
import org.apache.druid.segment.column.ColumnType;

import javax.annotation.Nullable;

/**
 * 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
{
  /**
   * 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.
   */
  ColumnType 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);

  /**
   *
   * @param selector            array selector
   * @param columnCapabilities  information about the underlying column to match. Null here just means the capabilities
   *                            are unknown, and not necessarily indicative that the column doesn't exist
   */
  T makeArrayProcessor(BaseObjectColumnValueSelector selector, @Nullable ColumnCapabilities columnCapabilities);

  /**
   * Create a processor for a complex column.
   *
   * @param selector object selector
   */
  T makeComplexProcessor(BaseObjectColumnValueSelector selector);
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy