mirror of https://github.com/apache/druid.git
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
This commit is contained in:
parent
ca4e64aea3
commit
24f8f9e1ab
|
@ -233,12 +233,25 @@ public class SqlSegmentsMetadataQuery
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (i == intervals.size() - 1) {
|
// Add a special check for a segment which have one end at eternity and the other at some finite value. Since
|
||||||
sb.append(")");
|
// we are using string comparison, a segment with this start or end will not be returned otherwise.
|
||||||
} else {
|
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 ");
|
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
|
final Query<Map<String, Object>> sql = handle
|
||||||
|
|
|
@ -53,6 +53,7 @@ import org.joda.time.DateTime;
|
||||||
import org.joda.time.Interval;
|
import org.joda.time.Interval;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
import org.junit.rules.ExpectedException;
|
||||||
|
@ -97,6 +98,42 @@ public class IndexerSQLMetadataStorageCoordinatorTest
|
||||||
100
|
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(
|
private final DataSegment defaultSegment2 = new DataSegment(
|
||||||
"fooDataSource",
|
"fooDataSource",
|
||||||
Intervals.of("2015-01-01T00Z/2015-01-02T00Z"),
|
Intervals.of("2015-01-01T00Z/2015-01-02T00Z"),
|
||||||
|
@ -254,6 +291,18 @@ public class IndexerSQLMetadataStorageCoordinatorTest
|
||||||
100
|
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 Set<DataSegment> SEGMENTS = ImmutableSet.of(defaultSegment, defaultSegment2);
|
||||||
private final AtomicLong metadataUpdateCounter = new AtomicLong();
|
private final AtomicLong metadataUpdateCounter = new AtomicLong();
|
||||||
private final AtomicLong segmentTableDropUpdateCounter = 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
|
@Test
|
||||||
public void testDeleteDataSourceMetadata() throws IOException
|
public void testDeleteDataSourceMetadata() throws IOException
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue