org.apache.druid.query.topn.TopNQueryBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.druid.query.topn.TopNQueryBuilder.java

Source

/*
 * 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.query.topn;

import com.google.common.collect.Lists;
import org.apache.druid.java.util.common.granularity.Granularities;
import org.apache.druid.java.util.common.granularity.Granularity;
import org.apache.druid.query.DataSource;
import org.apache.druid.query.TableDataSource;
import org.apache.druid.query.aggregation.AggregatorFactory;
import org.apache.druid.query.aggregation.PostAggregator;
import org.apache.druid.query.dimension.DefaultDimensionSpec;
import org.apache.druid.query.dimension.DimensionSpec;
import org.apache.druid.query.filter.DimFilter;
import org.apache.druid.query.filter.InDimFilter;
import org.apache.druid.query.filter.SelectorDimFilter;
import org.apache.druid.query.spec.LegacySegmentSpec;
import org.apache.druid.query.spec.QuerySegmentSpec;
import org.apache.druid.segment.VirtualColumn;
import org.apache.druid.segment.VirtualColumns;
import org.joda.time.Interval;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * A Builder for TopNQuery.
 *
 * Required: dataSource(), intervals(), metric() and threshold() must be called before build()
 * Additional requirement for numeric metric sorts: aggregators() must be called before build()
 *
 * Optional: filters(), granularity(), postAggregators() and context() can be called before build()
 *
 * Usage example:
 * <pre><code>
 *   TopNQuery query = new TopNQueryBuilder()
 *                                  .dataSource("Example")
 *                                  .dimension("example_dim")
 *                                  .metric("example_metric")
 *                                  .threshold(100)
 *                                  .intervals("2012-01-01/2012-01-02")
 *                                  .build();
 * </code></pre>
 *
 * @see TopNQuery
 */
public class TopNQueryBuilder {
    private DataSource dataSource;
    private VirtualColumns virtualColumns;
    private DimensionSpec dimensionSpec;
    private TopNMetricSpec topNMetricSpec;
    private int threshold;
    private QuerySegmentSpec querySegmentSpec;
    private DimFilter dimFilter;
    private Granularity granularity;
    private List<AggregatorFactory> aggregatorSpecs;
    private List<PostAggregator> postAggregatorSpecs;
    private Map<String, Object> context;

    public TopNQueryBuilder() {
        dataSource = null;
        virtualColumns = null;
        dimensionSpec = null;
        topNMetricSpec = null;
        threshold = 0;
        querySegmentSpec = null;
        dimFilter = null;
        granularity = Granularities.ALL;
        aggregatorSpecs = Lists.newArrayList();
        postAggregatorSpecs = Lists.newArrayList();
        context = null;
    }

    public TopNQueryBuilder(final TopNQuery query) {
        this.dataSource = query.getDataSource();
        this.virtualColumns = query.getVirtualColumns();
        this.dimensionSpec = query.getDimensionSpec();
        this.topNMetricSpec = query.getTopNMetricSpec();
        this.threshold = query.getThreshold();
        this.querySegmentSpec = query.getQuerySegmentSpec();
        this.dimFilter = query.getDimensionsFilter();
        this.granularity = query.getGranularity();
        this.aggregatorSpecs = query.getAggregatorSpecs();
        this.postAggregatorSpecs = query.getPostAggregatorSpecs();
        this.context = query.getContext();
    }

    public TopNQuery build() {
        return new TopNQuery(dataSource, virtualColumns, dimensionSpec, topNMetricSpec, threshold, querySegmentSpec,
                dimFilter, granularity, aggregatorSpecs, postAggregatorSpecs, context);
    }

    @Deprecated
    public TopNQueryBuilder copy(TopNQuery query) {
        return new TopNQueryBuilder(query);
    }

    @Deprecated
    public TopNQueryBuilder copy(TopNQueryBuilder builder) {
        return new TopNQueryBuilder().dataSource(builder.dataSource).virtualColumns(builder.virtualColumns)
                .dimension(builder.dimensionSpec).metric(builder.topNMetricSpec).threshold(builder.threshold)
                .intervals(builder.querySegmentSpec).filters(builder.dimFilter).granularity(builder.granularity)
                .aggregators(builder.aggregatorSpecs).postAggregators(builder.postAggregatorSpecs)
                .context(builder.context);
    }

    public TopNQueryBuilder dataSource(String d) {
        dataSource = new TableDataSource(d);
        return this;
    }

    public TopNQueryBuilder virtualColumns(VirtualColumns virtualColumns) {
        this.virtualColumns = virtualColumns;
        return this;
    }

    public TopNQueryBuilder virtualColumns(VirtualColumn... virtualColumns) {
        return virtualColumns(VirtualColumns.create(Arrays.asList(virtualColumns)));
    }

    public TopNQueryBuilder dataSource(DataSource d) {
        dataSource = d;
        return this;
    }

    public TopNQueryBuilder dimension(String d) {
        return dimension(d, null);
    }

    public TopNQueryBuilder dimension(String d, String outputName) {
        return dimension(new DefaultDimensionSpec(d, outputName));
    }

    public TopNQueryBuilder dimension(DimensionSpec d) {
        dimensionSpec = d;
        return this;
    }

    public TopNQueryBuilder metric(String s) {
        return metric(new NumericTopNMetricSpec(s));
    }

    public TopNQueryBuilder metric(TopNMetricSpec t) {
        topNMetricSpec = t;
        return this;
    }

    public TopNQueryBuilder threshold(int i) {
        threshold = i;
        return this;
    }

    public TopNQueryBuilder intervals(QuerySegmentSpec q) {
        querySegmentSpec = q;
        return this;
    }

    public TopNQueryBuilder intervals(String s) {
        querySegmentSpec = new LegacySegmentSpec(s);
        return this;
    }

    public TopNQueryBuilder intervals(List<Interval> l) {
        querySegmentSpec = new LegacySegmentSpec(l);
        return this;
    }

    public TopNQueryBuilder filters(String dimensionName, String value) {
        dimFilter = new SelectorDimFilter(dimensionName, value, null);
        return this;
    }

    public TopNQueryBuilder filters(String dimensionName, String value, String... values) {
        dimFilter = new InDimFilter(dimensionName, Lists.asList(value, values), null);
        return this;
    }

    public TopNQueryBuilder filters(DimFilter f) {
        dimFilter = f;
        return this;
    }

    public TopNQueryBuilder granularity(Granularity g) {
        granularity = g;
        return this;
    }

    @SuppressWarnings("unchecked")
    public TopNQueryBuilder aggregators(List<? extends AggregatorFactory> a) {
        aggregatorSpecs = new ArrayList<>(a); // defensive copy
        return this;
    }

    public TopNQueryBuilder postAggregators(Collection<PostAggregator> p) {
        postAggregatorSpecs = new ArrayList<>(p); // defensive copy
        return this;
    }

    public TopNQueryBuilder context(Map<String, Object> c) {
        context = c;
        return this;
    }

}