Class DimensionRangeShardSpec
- java.lang.Object
-
- org.apache.druid.timeline.partition.BaseDimensionRangeShardSpec
-
- org.apache.druid.timeline.partition.DimensionRangeShardSpec
-
- All Implemented Interfaces:
ShardSpec
- Direct Known Subclasses:
SingleDimensionShardSpec
public class DimensionRangeShardSpec extends BaseDimensionRangeShardSpec
ShardSpec
for partitioning based on ranges of one or more dimensions.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.apache.druid.timeline.partition.ShardSpec
ShardSpec.Type
-
-
Field Summary
Fields Modifier and Type Field Description static int
UNKNOWN_NUM_CORE_PARTITIONS
-
Fields inherited from class org.apache.druid.timeline.partition.BaseDimensionRangeShardSpec
dimensions, end, start
-
-
Constructor Summary
Constructors Constructor Description DimensionRangeShardSpec(List<String> dimensions, StringTuple start, StringTuple end, int partitionNum, Integer numCorePartitions)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description <T> PartitionChunk<T>
createChunk(T obj)
boolean
equals(Object o)
List<String>
getDimensions()
List<String>
getDomainDimensions()
Get dimensions who have possible range for the rows this shard contains.StringTuple
getEndTuple()
int
getNumCorePartitions()
int
getPartitionNum()
Returns the partition ID of this segment.StringTuple
getStartTuple()
String
getType()
Get the type name of this ShardSpec.int
hashCode()
boolean
isNumCorePartitionsUnknown()
boolean
possibleInDomain(Map<String,com.google.common.collect.RangeSet<String>> domain)
Set[:i] is the cartesian product of Set[0],...,Set[i - 1] EffectiveDomain[:i] is defined as QueryDomain[:i] INTERSECTION SegmentRange[:i] i = 1 If EffectiveDomain[:i] == {start[:i]} || EffectiveDomain == {end[:i]}: if i == index.dimensions.size: ACCEPT segment else: REPEAT with i = i + 1 else if EffectiveDomain[:i] == {}: PRUNE segment else: ACCEPT segment Example: Index on (Hour, Minute, Second).String
toString()
-
Methods inherited from class org.apache.druid.timeline.partition.BaseDimensionRangeShardSpec
getInputRowTuple, getLookup
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.druid.timeline.partition.ShardSpec
getAtomicUpdateGroupSize, getEndRootPartitionId, getMinorVersion, getStartRootPartitionId, sharePartitionSpace
-
-
-
-
Field Detail
-
UNKNOWN_NUM_CORE_PARTITIONS
public static final int UNKNOWN_NUM_CORE_PARTITIONS
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
DimensionRangeShardSpec
public DimensionRangeShardSpec(List<String> dimensions, @Nullable StringTuple start, @Nullable StringTuple end, int partitionNum, @Nullable Integer numCorePartitions)
- Parameters:
dimensions
- partition dimensionsstart
- inclusive start of this rangeend
- exclusive end of this rangepartitionNum
- unique ID for this shard
-
-
Method Detail
-
getStartTuple
@Nullable public StringTuple getStartTuple()
-
getEndTuple
@Nullable public StringTuple getEndTuple()
-
getPartitionNum
public int getPartitionNum()
Description copied from interface:ShardSpec
Returns the partition ID of this segment.
-
getNumCorePartitions
public int getNumCorePartitions()
-
isNumCorePartitionsUnknown
public boolean isNumCorePartitionsUnknown()
-
getDomainDimensions
public List<String> getDomainDimensions()
Description copied from interface:ShardSpec
Get dimensions who have possible range for the rows this shard contains.- Returns:
- list of dimensions who has its possible range. Dimensions with unknown possible range are not listed
-
possibleInDomain
public boolean possibleInDomain(Map<String,com.google.common.collect.RangeSet<String>> domain)
Set[:i] is the cartesian product of Set[0],...,Set[i - 1] EffectiveDomain[:i] is defined as QueryDomain[:i] INTERSECTION SegmentRange[:i] i = 1 If EffectiveDomain[:i] == {start[:i]} || EffectiveDomain == {end[:i]}: if i == index.dimensions.size: ACCEPT segment else: REPEAT with i = i + 1 else if EffectiveDomain[:i] == {}: PRUNE segment else: ACCEPT segment Example: Index on (Hour, Minute, Second). Index.size is 3 I) start = (3, 25, 10) end = (5, 10, 30) query domain = {3} * [0, 10] * {10, 20, 30, 40} EffectiveDomain[:1] == {3} == start[:1] EffectiveDomain[:2] == {3} * ([0, 10] INTERSECTION [25, INF)) == {} -> PRUNE II) start = (3, 25, 10) end = (5, 15, 30) query domain = {4} * [0, 10] * {10, 20, 30, 40} EffectiveDomain[:1] == {4} (!= {} && != start[:1] && != {end[:1]}) -> ACCEPT III) start = (3, 25, 10) end = (5, 15, 30) query domain = {5} * [0, 10] * {10, 20, 30, 40} EffectiveDomain[:1] == {5} == end[:1] EffectiveDomain[:2] == {5} * ([0, 10] INTERSECTION (-INF, 15]) == {5} * [0, 10] (! ={} && != {end[:2]}) -> ACCEPT IV) start = (3, 25, 10) end = (5, 15, 30) query domain = {5} * [15, 40] * {10, 20, 30, 40} EffectiveDomain[:1] == {5} == end[:1] EffectiveDomain[:2] == {5} * ([15, 40] INTERSECTION (-INF, 15]) == {5} * {15} == {end[:2]} EffectiveDomain[:3] == {5} * {15} * ({10, 20, 30, 40} * (-INF, 30]) == {5} * {15} * {10, 20, 30} != {} -> ACCEPT V) start = (3, 25, 10) end = (5, 15, 30) query domain = {5} * [15, 40] * {50} EffectiveDomain[:1] == {5} == end[:1] EffectiveDomain[:2] == {5} * ([15, 40] INTERSECTION (-INF, 15]) == {5} * {15} == {end[:2]} EffectiveDomain[:3] == {5} * {15} * ({40} * (-INF, 30]) == {5} * {15} * {} == {} -> PRUNE- Parameters:
domain
- The domain inferred from the query. Assumed to be non-emtpy- Returns:
- true if segment needs to be considered for query, false if it can be pruned
-
createChunk
public <T> PartitionChunk<T> createChunk(T obj)
-
getType
public String getType()
Description copied from interface:ShardSpec
Get the type name of this ShardSpec.
-
-