Skip to content

Commit d64c7c0

Browse files
authored
Interval optimization for subclasses of DataSegment (apache#18594)
* Interval optimization for subclasses of DataSegment * Rename parameter name to serializedInterval
1 parent ca33ab1 commit d64c7c0

3 files changed

Lines changed: 25 additions & 23 deletions

File tree

multi-stage-query/src/main/java/org/apache/druid/msq/input/table/DataSegmentWithLocation.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
2626
import com.google.common.base.Preconditions;
2727
import org.apache.druid.jackson.CommaListJoinDeserializer;
28+
import org.apache.druid.java.util.common.Intervals;
2829
import org.apache.druid.server.coordination.DruidServerMetadata;
2930
import org.apache.druid.timeline.CompactionState;
3031
import org.apache.druid.timeline.DataSegment;
3132
import org.apache.druid.timeline.partition.ShardSpec;
32-
import org.joda.time.Interval;
3333

3434
import javax.annotation.Nullable;
3535
import java.util.List;
@@ -45,9 +45,9 @@ public class DataSegmentWithLocation extends DataSegment
4545
private final Set<DruidServerMetadata> servers;
4646

4747
@JsonCreator
48-
public DataSegmentWithLocation(
48+
private DataSegmentWithLocation(
4949
@JsonProperty("dataSource") String dataSource,
50-
@JsonProperty("interval") Interval interval,
50+
@JsonProperty("interval") String interval,
5151
@JsonProperty("version") String version,
5252
// use `Map` *NOT* `LoadSpec` because we want to do lazy materialization to prevent dependency pollution
5353
@JsonProperty("loadSpec") @Nullable Map<String, Object> loadSpec,
@@ -66,7 +66,7 @@ public DataSegmentWithLocation(
6666
{
6767
super(
6868
dataSource,
69-
interval,
69+
Intervals.fromString(interval),
7070
version,
7171
loadSpec,
7272
dimensions,

processing/src/main/java/org/apache/druid/java/util/common/Intervals.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -78,36 +78,39 @@ public static Interval of(String format, Object... formatArgs)
7878
*
7979
* Currently, this method is only used in {@link org.apache.druid.timeline.SegmentId}.
8080
*/
81-
public static Interval fromString(String string)
81+
public static Interval fromString(String serializedInterval)
8282
{
83-
Interval interval = null;
84-
if (canDeserializeIntervalOptimallyFromString(string)) {
85-
interval = tryOptimizedIntervalDeserialization(string);
83+
if (canDeserializeIntervalOptimallyFromString(serializedInterval)) {
84+
Interval interval = tryOptimizedIntervalDeserialization(serializedInterval);
85+
86+
if (interval != null) {
87+
return interval;
88+
}
8689
}
8790

88-
return interval == null ? Intervals.of(string) : interval;
91+
return Intervals.of(serializedInterval);
8992
}
9093

91-
private static boolean canDeserializeIntervalOptimallyFromString(String intervalText)
94+
private static boolean canDeserializeIntervalOptimallyFromString(String serializedInterval)
9295
{
9396
// Optimized version does not deal well with Periods.
94-
if (intervalText.contains("P")) {
97+
if (serializedInterval.contains("P")) {
9598
return false;
9699
}
97100

98-
final int slashIndex = intervalText.indexOf('/');
99-
return (slashIndex > 0 && slashIndex < intervalText.length() - 1);
101+
final int slashIndex = serializedInterval.indexOf('/');
102+
return (slashIndex > 0 && slashIndex < serializedInterval.length() - 1);
100103
}
101104

102105
/**
103106
* @return null if the input format cannot be parsed with optimized strategy, else return the Interval.
104107
*/
105108
@Nullable
106-
private static Interval tryOptimizedIntervalDeserialization(final String intervalText)
109+
private static Interval tryOptimizedIntervalDeserialization(final String serializedInterval)
107110
{
108-
final int slashIndex = intervalText.indexOf('/');
109-
final String startStr = intervalText.substring(0, slashIndex);
110-
final String endStr = intervalText.substring(slashIndex + 1);
111+
final int slashIndex = serializedInterval.indexOf('/');
112+
final String startStr = serializedInterval.substring(0, slashIndex);
113+
final String endStr = serializedInterval.substring(slashIndex + 1);
111114

112115
try {
113116
final long startMillis = FAST_ISO_UTC_FORMATTER.parseMillis(startStr);

server/src/main/java/org/apache/druid/server/coordination/LoadableDataSegment.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
import com.fasterxml.jackson.annotation.JsonProperty;
2424
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
2525
import org.apache.druid.jackson.CommaListJoinDeserializer;
26+
import org.apache.druid.java.util.common.Intervals;
2627
import org.apache.druid.timeline.CompactionState;
2728
import org.apache.druid.timeline.DataSegment;
2829
import org.apache.druid.timeline.partition.ShardSpec;
29-
import org.joda.time.Interval;
3030

3131
import javax.annotation.Nullable;
3232
import java.util.List;
@@ -35,15 +35,15 @@
3535
/**
3636
* A deserialization aid used by {@link SegmentChangeRequestLoad}. The broker prunes the loadSpec from segments
3737
* for efficiency reasons, but the broker does need the loadSpec when it loads broadcast segments.
38-
*
38+
* <p>
3939
* This class always uses the non-pruning default {@link PruneSpecsHolder}.
4040
*/
4141
public class LoadableDataSegment extends DataSegment
4242
{
4343
@JsonCreator
44-
public LoadableDataSegment(
44+
private LoadableDataSegment(
4545
@JsonProperty("dataSource") String dataSource,
46-
@JsonProperty("interval") Interval interval,
46+
@JsonProperty("interval") String interval,
4747
@JsonProperty("version") String version,
4848
// use `Map` *NOT* `LoadSpec` because we want to do lazy materialization to prevent dependency pollution
4949
@JsonProperty("loadSpec") @Nullable Map<String, Object> loadSpec,
@@ -58,7 +58,7 @@ public LoadableDataSegment(
5858
{
5959
super(
6060
dataSource,
61-
interval,
61+
Intervals.fromString(interval),
6262
version,
6363
loadSpec,
6464
dimensions,
@@ -70,6 +70,5 @@ public LoadableDataSegment(
7070
size,
7171
PruneSpecsHolder.DEFAULT
7272
);
73-
7473
}
7574
}

0 commit comments

Comments
 (0)