/** * Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com) * * Licensed 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 com.linkedin.pinot.common.data; import com.google.common.base.Objects; import java.util.Collections; import java.util.List; import java.util.Set; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public class StarTreeIndexSpec { public static final Integer DEFAULT_MAX_LEAF_RECORDS = 100000; // TODO: determine a good number via experiment public static final int DEFAULT_SKIP_MATERIALIZATION_CARDINALITY_THRESHOLD = 10000; /** The upper bound on the number of leaf records to be scanned for any query */ private Integer maxLeafRecords = DEFAULT_MAX_LEAF_RECORDS; /** Dimension split order (if null or absent, descending w.r.t. dimension cardinality) */ private List<String> dimensionsSplitOrder; /** Dimensions for which to exclude star nodes at split. */ private Set<String> skipStarNodeCreationForDimensions = Collections.emptySet(); private Set<String> _skipMaterializationForDimensions; private int skipMaterializationCardinalityThreshold = DEFAULT_SKIP_MATERIALIZATION_CARDINALITY_THRESHOLD; private boolean enableOffHeapFormat = true; public StarTreeIndexSpec() {} public Integer getMaxLeafRecords() { return maxLeafRecords; } public void setMaxLeafRecords(Integer maxLeafRecords) { this.maxLeafRecords = maxLeafRecords; } public List<String> getDimensionsSplitOrder() { return dimensionsSplitOrder; } public void setDimensionsSplitOrder(List<String> dimensionsSplitOrder) { this.dimensionsSplitOrder = dimensionsSplitOrder; } public void setSkipStarNodeCreationForDimensions(Set<String> skipStarNodeCreationForDimensions) { this.skipStarNodeCreationForDimensions = skipStarNodeCreationForDimensions; } public Set<String> getSkipStarNodeCreationForDimensions() { return skipStarNodeCreationForDimensions; } public Set<String> getskipMaterializationForDimensions() { return _skipMaterializationForDimensions; } public void setSkipMaterializationForDimensions(Set<String> skipMaterializationForDimensions) { _skipMaterializationForDimensions = skipMaterializationForDimensions; } public int getskipMaterializationCardinalityThreshold() { return skipMaterializationCardinalityThreshold; } public void setSkipMaterializationCardinalityThreshold(int skipMaterializationCardinalityThreshold) { this.skipMaterializationCardinalityThreshold = skipMaterializationCardinalityThreshold; } @Override public boolean equals(Object o) { if (!(o instanceof StarTreeIndexSpec)) { return false; } StarTreeIndexSpec s = (StarTreeIndexSpec) o; return Objects.equal(maxLeafRecords, s.getMaxLeafRecords()) && Objects.equal(dimensionsSplitOrder, s.getDimensionsSplitOrder()); } @Override public int hashCode() { return Objects.hashCode(maxLeafRecords, dimensionsSplitOrder); } @Override public String toString() { return Objects.toStringHelper(this) .add("maxLeafRecords", maxLeafRecords) .add("dimensionsSplitOrder", dimensionsSplitOrder) .toString(); } /** * Returns True if StarTreeOffHeap is enabled, False otherwise. * @return */ public boolean isEnableOffHeapFormat() { return enableOffHeapFormat; } /** * Enable/Disable StarTreeOffHeapFormat. * @param enableOffHeapFormat */ public void setEnableOffHeapFormat(boolean enableOffHeapFormat) { this.enableOffHeapFormat = enableOffHeapFormat; } }