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]

Reply via email to