This is an automated email from the ASF dual-hosted git repository.

gian 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 24f8f9e1ab Add check for eternity time segment to 
SqlSegmentsMetadataQuery (#12844)
24f8f9e1ab is described below

commit 24f8f9e1ab4199fd46e906e2506e35c0a467a65d
Author: Adarsh Sanjeev <[email protected]>
AuthorDate: Fri Aug 5 11:03:08 2022 +0530

    Add check for eternity time segment to SqlSegmentsMetadataQuery (#12844)
    
    * Add check for eternity time segment to SqlSegmentsMetadataQuery
    
    * Add check for half eternities
    
    * Add multiple segments test
    
    * Add failing test to document known issue
---
 .../druid/metadata/SqlSegmentsMetadataQuery.java   |  19 +-
 .../IndexerSQLMetadataStorageCoordinatorTest.java  | 202 +++++++++++++++++++++
 2 files changed, 218 insertions(+), 3 deletions(-)

diff --git 
a/server/src/main/java/org/apache/druid/metadata/SqlSegmentsMetadataQuery.java 
b/server/src/main/java/org/apache/druid/metadata/SqlSegmentsMetadataQuery.java
index 4ecf7bebe6..0c3ddfc890 100644
--- 
a/server/src/main/java/org/apache/druid/metadata/SqlSegmentsMetadataQuery.java
+++ 
b/server/src/main/java/org/apache/druid/metadata/SqlSegmentsMetadataQuery.java
@@ -233,12 +233,25 @@ public class SqlSegmentsMetadataQuery
             )
         );
 
-        if (i == intervals.size() - 1) {
-          sb.append(")");
-        } else {
+        // Add a special check for a segment which have one end at eternity 
and the other at some finite value. Since
+        // we are using string comparison, a segment with this start or end 
will not be returned otherwise.
+        if (matchMode.equals(IntervalMode.OVERLAPS)) {
+          sb.append(StringUtils.format(" OR (start = '%s' AND \"end\" != '%s' 
AND \"end\" > :start%d)", Intervals.ETERNITY.getStart(), 
Intervals.ETERNITY.getEnd(), i));
+          sb.append(StringUtils.format(" OR (start != '%s' AND \"end\" = '%s' 
AND start < :end%d)", Intervals.ETERNITY.getStart(), 
Intervals.ETERNITY.getEnd(), i));
+        }
+
+        if (i != intervals.size() - 1) {
           sb.append(" OR ");
         }
       }
+
+      // Add a special check for a single segment with eternity. Since we are 
using string comparison, a segment with
+      // this start and end will not be returned otherwise.
+      // Known Issue: https://github.com/apache/druid/issues/12860
+      if (matchMode.equals(IntervalMode.OVERLAPS)) {
+        sb.append(StringUtils.format(" OR (start = '%s' AND \"end\" = '%s')", 
Intervals.ETERNITY.getStart(), Intervals.ETERNITY.getEnd()));
+      }
+      sb.append(")");
     }
 
     final Query<Map<String, Object>> sql = handle
diff --git 
a/server/src/test/java/org/apache/druid/metadata/IndexerSQLMetadataStorageCoordinatorTest.java
 
b/server/src/test/java/org/apache/druid/metadata/IndexerSQLMetadataStorageCoordinatorTest.java
index fca3366b88..6f8d0caaf8 100644
--- 
a/server/src/test/java/org/apache/druid/metadata/IndexerSQLMetadataStorageCoordinatorTest.java
+++ 
b/server/src/test/java/org/apache/druid/metadata/IndexerSQLMetadataStorageCoordinatorTest.java
@@ -53,6 +53,7 @@ import org.joda.time.DateTime;
 import org.joda.time.Interval;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -97,6 +98,42 @@ public class IndexerSQLMetadataStorageCoordinatorTest
       100
   );
 
+  private final DataSegment eternitySegment = new DataSegment(
+      "fooDataSource",
+      Intervals.ETERNITY,
+      "version",
+      ImmutableMap.of(),
+      ImmutableList.of("dim1"),
+      ImmutableList.of("m1"),
+      new LinearShardSpec(0),
+      9,
+      100
+  );
+
+
+  private final DataSegment firstHalfEternityRangeSegment = new DataSegment(
+      "fooDataSource",
+      new Interval(DateTimes.MIN, DateTimes.of("3000")),
+      "version",
+      ImmutableMap.of(),
+      ImmutableList.of("dim1"),
+      ImmutableList.of("m1"),
+      new LinearShardSpec(0),
+      9,
+      100
+  );
+
+  private final DataSegment secondHalfEternityRangeSegment = new DataSegment(
+      "fooDataSource",
+      new Interval(DateTimes.of("1970"), DateTimes.MAX),
+      "version",
+      ImmutableMap.of(),
+      ImmutableList.of("dim1"),
+      ImmutableList.of("m1"),
+      new LinearShardSpec(0),
+      9,
+      100
+  );
   private final DataSegment defaultSegment2 = new DataSegment(
       "fooDataSource",
       Intervals.of("2015-01-01T00Z/2015-01-02T00Z"),
@@ -254,6 +291,18 @@ public class IndexerSQLMetadataStorageCoordinatorTest
       100
   );
 
+  private final DataSegment hugeTimeRangeSegment4 = new DataSegment(
+      "hugeTimeRangeDataSource",
+      Intervals.of("1990-01-01T00Z/19940-01-01T00Z"),
+      "zversion",
+      ImmutableMap.of(),
+      ImmutableList.of("dim1"),
+      ImmutableList.of("m1"),
+      new NumberedShardSpec(0, 1),
+      9,
+      100
+  );
+
   private final Set<DataSegment> SEGMENTS = ImmutableSet.of(defaultSegment, 
defaultSegment2);
   private final AtomicLong metadataUpdateCounter = new AtomicLong();
   private final AtomicLong segmentTableDropUpdateCounter = new AtomicLong();
@@ -1202,6 +1251,159 @@ public class IndexerSQLMetadataStorageCoordinatorTest
     );
   }
 
+
+  @Test
+  public void testEternitySegmentWithStringComparison() throws IOException
+  {
+    coordinator.announceHistoricalSegments(
+        ImmutableSet.of(
+            eternitySegment
+        )
+    );
+
+    Assert.assertEquals(
+        ImmutableSet.of(eternitySegment),
+        ImmutableSet.copyOf(
+            coordinator.retrieveUsedSegmentsForInterval(
+                eternitySegment.getDataSource(),
+                Intervals.of("2020/2021"),
+                Segments.ONLY_VISIBLE
+            )
+        )
+    );
+  }
+
+  @Test
+  public void testEternityMultipleSegmentWithStringComparison() throws 
IOException
+  {
+    coordinator.announceHistoricalSegments(
+        ImmutableSet.of(
+            numberedSegment0of0,
+            eternitySegment
+        )
+    );
+
+    Assert.assertEquals(
+        ImmutableSet.of(eternitySegment, numberedSegment0of0),
+        ImmutableSet.copyOf(
+            coordinator.retrieveUsedSegmentsForInterval(
+                eternitySegment.getDataSource(),
+                Intervals.of("2015/2016"),
+                Segments.ONLY_VISIBLE
+            )
+        )
+    );
+  }
+
+  @Test
+  public void testFirstHalfEternitySegmentWithStringComparison() throws 
IOException
+  {
+    coordinator.announceHistoricalSegments(
+        ImmutableSet.of(
+            firstHalfEternityRangeSegment
+        )
+    );
+
+    Assert.assertEquals(
+        ImmutableSet.of(firstHalfEternityRangeSegment),
+        ImmutableSet.copyOf(
+            coordinator.retrieveUsedSegmentsForInterval(
+                firstHalfEternityRangeSegment.getDataSource(),
+                Intervals.of("2020/2021"),
+                Segments.ONLY_VISIBLE
+            )
+        )
+    );
+  }
+
+  @Test
+  public void testFirstHalfEternityMultipleSegmentWithStringComparison() 
throws IOException
+  {
+    coordinator.announceHistoricalSegments(
+        ImmutableSet.of(
+            numberedSegment0of0,
+            firstHalfEternityRangeSegment
+        )
+    );
+
+    Assert.assertEquals(
+        ImmutableSet.of(numberedSegment0of0, firstHalfEternityRangeSegment),
+        ImmutableSet.copyOf(
+            coordinator.retrieveUsedSegmentsForInterval(
+                firstHalfEternityRangeSegment.getDataSource(),
+                Intervals.of("2015/2016"),
+                Segments.ONLY_VISIBLE
+            )
+        )
+    );
+  }
+
+  @Test
+  public void testSecondHalfEternitySegmentWithStringComparison() throws 
IOException
+  {
+    coordinator.announceHistoricalSegments(
+        ImmutableSet.of(
+            secondHalfEternityRangeSegment
+        )
+    );
+
+    Assert.assertEquals(
+        ImmutableSet.of(secondHalfEternityRangeSegment),
+        ImmutableSet.copyOf(
+            coordinator.retrieveUsedSegmentsForInterval(
+                secondHalfEternityRangeSegment.getDataSource(),
+                Intervals.of("2020/2021"),
+                Segments.ONLY_VISIBLE
+            )
+        )
+    );
+  }
+
+  // Known Issue: https://github.com/apache/druid/issues/12860
+  @Ignore
+  @Test
+  public void testLargeIntervalWithStringComparison() throws IOException
+  {
+    coordinator.announceHistoricalSegments(
+        ImmutableSet.of(
+            hugeTimeRangeSegment4
+        )
+    );
+
+    Assert.assertEquals(
+        ImmutableSet.of(hugeTimeRangeSegment4),
+        ImmutableSet.copyOf(
+            coordinator.retrieveUsedSegmentsForInterval(
+                hugeTimeRangeSegment4.getDataSource(),
+                Intervals.of("2020/2021"),
+                Segments.ONLY_VISIBLE
+            )
+        )
+    );
+  }
+
+  @Test
+  public void testSecondHalfEternityMultipleSegmentWithStringComparison() 
throws IOException
+  {
+    coordinator.announceHistoricalSegments(
+        ImmutableSet.of(
+            numberedSegment0of0,
+            secondHalfEternityRangeSegment
+        )
+    );
+
+    Assert.assertEquals(
+        ImmutableSet.of(numberedSegment0of0, secondHalfEternityRangeSegment),
+        ImmutableSet.copyOf(
+            coordinator.retrieveUsedSegmentsForInterval(
+                secondHalfEternityRangeSegment.getDataSource(),
+                Intervals.of("2015/2016"),
+                Segments.ONLY_VISIBLE
+            )
+        )
+    );
+  }
+
   @Test
   public void testDeleteDataSourceMetadata() throws IOException
   {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to