This is an automated email from the ASF dual-hosted git repository.
frankchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new d64c7c0a24c Interval optimization for subclasses of DataSegment
(#18594)
d64c7c0a24c is described below
commit d64c7c0a24cb909bdcf14950f1b23b69da1c5483
Author: Virushade <[email protected]>
AuthorDate: Sat Oct 4 16:34:23 2025 +0800
Interval optimization for subclasses of DataSegment (#18594)
* Interval optimization for subclasses of DataSegment
* Rename parameter name to serializedInterval
---
.../msq/input/table/DataSegmentWithLocation.java | 8 +++---
.../apache/druid/java/util/common/Intervals.java | 29 ++++++++++++----------
.../server/coordination/LoadableDataSegment.java | 11 ++++----
3 files changed, 25 insertions(+), 23 deletions(-)
diff --git
a/multi-stage-query/src/main/java/org/apache/druid/msq/input/table/DataSegmentWithLocation.java
b/multi-stage-query/src/main/java/org/apache/druid/msq/input/table/DataSegmentWithLocation.java
index 92d017a0dba..603a0f33e52 100644
---
a/multi-stage-query/src/main/java/org/apache/druid/msq/input/table/DataSegmentWithLocation.java
+++
b/multi-stage-query/src/main/java/org/apache/druid/msq/input/table/DataSegmentWithLocation.java
@@ -25,11 +25,11 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.common.base.Preconditions;
import org.apache.druid.jackson.CommaListJoinDeserializer;
+import org.apache.druid.java.util.common.Intervals;
import org.apache.druid.server.coordination.DruidServerMetadata;
import org.apache.druid.timeline.CompactionState;
import org.apache.druid.timeline.DataSegment;
import org.apache.druid.timeline.partition.ShardSpec;
-import org.joda.time.Interval;
import javax.annotation.Nullable;
import java.util.List;
@@ -45,9 +45,9 @@ public class DataSegmentWithLocation extends DataSegment
private final Set<DruidServerMetadata> servers;
@JsonCreator
- public DataSegmentWithLocation(
+ private DataSegmentWithLocation(
@JsonProperty("dataSource") String dataSource,
- @JsonProperty("interval") Interval interval,
+ @JsonProperty("interval") String interval,
@JsonProperty("version") String version,
// use `Map` *NOT* `LoadSpec` because we want to do lazy materialization
to prevent dependency pollution
@JsonProperty("loadSpec") @Nullable Map<String, Object> loadSpec,
@@ -66,7 +66,7 @@ public class DataSegmentWithLocation extends DataSegment
{
super(
dataSource,
- interval,
+ Intervals.fromString(interval),
version,
loadSpec,
dimensions,
diff --git
a/processing/src/main/java/org/apache/druid/java/util/common/Intervals.java
b/processing/src/main/java/org/apache/druid/java/util/common/Intervals.java
index 80be5a738d4..0960f63b497 100644
--- a/processing/src/main/java/org/apache/druid/java/util/common/Intervals.java
+++ b/processing/src/main/java/org/apache/druid/java/util/common/Intervals.java
@@ -78,36 +78,39 @@ public final class Intervals
*
* Currently, this method is only used in {@link
org.apache.druid.timeline.SegmentId}.
*/
- public static Interval fromString(String string)
+ public static Interval fromString(String serializedInterval)
{
- Interval interval = null;
- if (canDeserializeIntervalOptimallyFromString(string)) {
- interval = tryOptimizedIntervalDeserialization(string);
+ if (canDeserializeIntervalOptimallyFromString(serializedInterval)) {
+ Interval interval =
tryOptimizedIntervalDeserialization(serializedInterval);
+
+ if (interval != null) {
+ return interval;
+ }
}
- return interval == null ? Intervals.of(string) : interval;
+ return Intervals.of(serializedInterval);
}
- private static boolean canDeserializeIntervalOptimallyFromString(String
intervalText)
+ private static boolean canDeserializeIntervalOptimallyFromString(String
serializedInterval)
{
// Optimized version does not deal well with Periods.
- if (intervalText.contains("P")) {
+ if (serializedInterval.contains("P")) {
return false;
}
- final int slashIndex = intervalText.indexOf('/');
- return (slashIndex > 0 && slashIndex < intervalText.length() - 1);
+ final int slashIndex = serializedInterval.indexOf('/');
+ return (slashIndex > 0 && slashIndex < serializedInterval.length() - 1);
}
/**
* @return null if the input format cannot be parsed with optimized
strategy, else return the Interval.
*/
@Nullable
- private static Interval tryOptimizedIntervalDeserialization(final String
intervalText)
+ private static Interval tryOptimizedIntervalDeserialization(final String
serializedInterval)
{
- final int slashIndex = intervalText.indexOf('/');
- final String startStr = intervalText.substring(0, slashIndex);
- final String endStr = intervalText.substring(slashIndex + 1);
+ final int slashIndex = serializedInterval.indexOf('/');
+ final String startStr = serializedInterval.substring(0, slashIndex);
+ final String endStr = serializedInterval.substring(slashIndex + 1);
try {
final long startMillis = FAST_ISO_UTC_FORMATTER.parseMillis(startStr);
diff --git
a/server/src/main/java/org/apache/druid/server/coordination/LoadableDataSegment.java
b/server/src/main/java/org/apache/druid/server/coordination/LoadableDataSegment.java
index 486bbf20bbb..1912ecdbe85 100644
---
a/server/src/main/java/org/apache/druid/server/coordination/LoadableDataSegment.java
+++
b/server/src/main/java/org/apache/druid/server/coordination/LoadableDataSegment.java
@@ -23,10 +23,10 @@ import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import org.apache.druid.jackson.CommaListJoinDeserializer;
+import org.apache.druid.java.util.common.Intervals;
import org.apache.druid.timeline.CompactionState;
import org.apache.druid.timeline.DataSegment;
import org.apache.druid.timeline.partition.ShardSpec;
-import org.joda.time.Interval;
import javax.annotation.Nullable;
import java.util.List;
@@ -35,15 +35,15 @@ import java.util.Map;
/**
* A deserialization aid used by {@link SegmentChangeRequestLoad}. The broker
prunes the loadSpec from segments
* for efficiency reasons, but the broker does need the loadSpec when it loads
broadcast segments.
- *
+ * <p>
* This class always uses the non-pruning default {@link PruneSpecsHolder}.
*/
public class LoadableDataSegment extends DataSegment
{
@JsonCreator
- public LoadableDataSegment(
+ private LoadableDataSegment(
@JsonProperty("dataSource") String dataSource,
- @JsonProperty("interval") Interval interval,
+ @JsonProperty("interval") String interval,
@JsonProperty("version") String version,
// use `Map` *NOT* `LoadSpec` because we want to do lazy materialization
to prevent dependency pollution
@JsonProperty("loadSpec") @Nullable Map<String, Object> loadSpec,
@@ -58,7 +58,7 @@ public class LoadableDataSegment extends DataSegment
{
super(
dataSource,
- interval,
+ Intervals.fromString(interval),
version,
loadSpec,
dimensions,
@@ -70,6 +70,5 @@ public class LoadableDataSegment extends DataSegment
size,
PruneSpecsHolder.DEFAULT
);
-
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]