blob: de3c5eeccaf6872fe4b53da3c2a086eb1cc3ed43 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.druid.timeline;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.apache.druid.java.util.common.DateTimes;
import org.apache.druid.java.util.common.Intervals;
import org.apache.druid.timeline.partition.IntegerPartitionChunk;
import org.apache.druid.timeline.partition.OvershadowableInteger;
import org.apache.druid.timeline.partition.PartitionHolder;
import org.joda.time.Interval;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
*/
public class VersionedIntervalTimelineTest extends VersionedIntervalTimelineTestBase
{
@Before
public void setUp()
{
timeline = makeStringIntegerTimeline();
}
@Test
public void testFindChunkWithOverlap()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-02/2011-01-05", "2", 1);
assertSingleElementChunks(
makeSingle("1", 1),
timeline.findChunk(Intervals.of("2011-01-02T02/2011-01-04"), "1", 0)
);
}
// 1|----|
// 1|----|
@Test(expected = UnsupportedOperationException.class)
public void testOverlapSameVersionThrowException()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-05/2011-01-15", "1", 3);
}
// 2|----|
// 2|----|
// 1|----|
// 1|----|
@Test
public void testOverlapSameVersionIsOkay()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-01/2011-01-10", "2", 2);
add("2011-01-01/2011-01-10", "2", 3);
add("2011-01-01/2011-01-10", "1", 4);
assertValues(
Collections.singletonList(
createExpected("2011-01-01/2011-01-10", "2", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-10"))
);
}
// 1|----|----|
// 2|----|
@Test
public void testOverlapSecondBetween()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-10/2011-01-20", "1", 2);
add("2011-01-05/2011-01-15", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 1),
createExpected("2011-01-05/2011-01-15", "2", 3),
createExpected("2011-01-15/2011-01-20", "1", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|----|
// 1|----|----|
@Test
public void testOverlapFirstBetween()
{
add("2011-01-05/2011-01-15", "2", 3);
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-10/2011-01-20", "1", 2);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 1),
createExpected("2011-01-05/2011-01-15", "2", 3),
createExpected("2011-01-15/2011-01-20", "1", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|----|
// 2|----|
@Test
public void testOverlapFirstBefore()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-05/2011-01-15", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 1),
createExpected("2011-01-05/2011-01-15", "2", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-15"))
);
}
// 2|----|
// 1|----|
@Test
public void testOverlapFirstAfter()
{
add("2011-01-05/2011-01-15", "2", 3);
add("2011-01-01/2011-01-10", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 1),
createExpected("2011-01-05/2011-01-15", "2", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-15"))
);
}
// 1|----|
// 2|----|
@Test
public void testOverlapSecondBefore()
{
add("2011-01-05/2011-01-15", "1", 3);
add("2011-01-01/2011-01-10", "2", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-10", "2", 1),
createExpected("2011-01-10/2011-01-15", "1", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-15"))
);
}
// 2|----|
// 1|----|
@Test
public void testOverlapSecondAfter()
{
add("2011-01-01/2011-01-10", "2", 3);
add("2011-01-05/2011-01-15", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-10", "2", 3),
createExpected("2011-01-10/2011-01-15", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-15"))
);
}
// 1|----------|
// 2|----|
@Test
public void testOverlapFirstLarger()
{
add("2011-01-01/2011-01-20", "1", 2);
add("2011-01-05/2011-01-15", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 2),
createExpected("2011-01-05/2011-01-15", "2", 3),
createExpected("2011-01-15/2011-01-20", "1", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|----|
// 1|----------|
@Test
public void testOverlapSecondLarger()
{
add("2011-01-05/2011-01-15", "2", 3);
add("2011-01-01/2011-01-20", "1", 2);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 2),
createExpected("2011-01-05/2011-01-15", "2", 3),
createExpected("2011-01-15/2011-01-20", "1", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|----|-----|
// 2|-------|
@Test
public void testOverlapSecondPartialAlign()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-10/2011-01-20", "1", 2);
add("2011-01-01/2011-01-15", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-15", "2", 3),
createExpected("2011-01-15/2011-01-20", "1", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|-------|
// 1|----|-----|
@Test
public void testOverlapFirstPartialAlign()
{
add("2011-01-01/2011-01-15", "2", 3);
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-10/2011-01-20", "1", 2);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-15", "2", 3),
createExpected("2011-01-15/2011-01-20", "1", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|-------|
// 2|------------|
// 3|---|
@Test
public void testOverlapAscending()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-05/2011-01-20", "2", 2);
add("2011-01-03/2011-01-06", "3", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-03", "1", 1),
createExpected("2011-01-03/2011-01-06", "3", 3),
createExpected("2011-01-06/2011-01-20", "2", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 3|---|
// 2|------------|
// 1|-------|
@Test
public void testOverlapDescending()
{
add("2011-01-03/2011-01-06", "3", 3);
add("2011-01-05/2011-01-20", "2", 2);
add("2011-01-01/2011-01-10", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-03", "1", 1),
createExpected("2011-01-03/2011-01-06", "3", 3),
createExpected("2011-01-06/2011-01-20", "2", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|------------|
// 3|---|
// 1|-------|
@Test
public void testOverlapMixed()
{
add("2011-01-05/2011-01-20", "2", 2);
add("2011-01-03/2011-01-06", "3", 3);
add("2011-01-01/2011-01-10", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-03", "1", 1),
createExpected("2011-01-03/2011-01-06", "3", 3),
createExpected("2011-01-06/2011-01-20", "2", 2)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|-------------|
// 2|--------|
// 3|-----|
@Test
public void testOverlapContainedAscending()
{
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-02/2011-01-10", "2", 2);
add("2011-01-02/2011-01-06", "3", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-02", "1", 1),
createExpected("2011-01-02/2011-01-06", "3", 3),
createExpected("2011-01-06/2011-01-10", "2", 2),
createExpected("2011-01-10/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 3|-----|
// 2|--------|
// 1|-------------|
@Test
public void testOverlapContainedDescending()
{
add("2011-01-02/2011-01-06", "3", 3);
add("2011-01-02/2011-01-10", "2", 2);
add("2011-01-01/2011-01-20", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-02", "1", 1),
createExpected("2011-01-02/2011-01-06", "3", 3),
createExpected("2011-01-06/2011-01-10", "2", 2),
createExpected("2011-01-10/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|--------|
// 3|-----|
// 1|-------------|
@Test
public void testOverlapContainedmixed()
{
add("2011-01-02/2011-01-10", "2", 2);
add("2011-01-02/2011-01-06", "3", 3);
add("2011-01-01/2011-01-20", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-02", "1", 1),
createExpected("2011-01-02/2011-01-06", "3", 3),
createExpected("2011-01-06/2011-01-10", "2", 2),
createExpected("2011-01-10/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|------|------|----|
// 2|-----|
@Test
public void testOverlapSecondContained()
{
add("2011-01-01/2011-01-07", "1", 1);
add("2011-01-07/2011-01-15", "1", 2);
add("2011-01-15/2011-01-20", "1", 3);
add("2011-01-10/2011-01-13", "2", 4);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-07", "1", 1),
createExpected("2011-01-07/2011-01-10", "1", 2),
createExpected("2011-01-10/2011-01-13", "2", 4),
createExpected("2011-01-13/2011-01-15", "1", 2),
createExpected("2011-01-15/2011-01-20", "1", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|-----|
// 1|------|------|----|
@Test
public void testOverlapFirstContained()
{
add("2011-01-10/2011-01-13", "2", 4);
add("2011-01-01/2011-01-07", "1", 1);
add("2011-01-07/2011-01-15", "1", 2);
add("2011-01-15/2011-01-20", "1", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-07", "1", 1),
createExpected("2011-01-07/2011-01-10", "1", 2),
createExpected("2011-01-10/2011-01-13", "2", 4),
createExpected("2011-01-13/2011-01-15", "1", 2),
createExpected("2011-01-15/2011-01-20", "1", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|----|----|
// 2|---------|
@Test
public void testOverlapSecondContainsFirst()
{
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-01/2011-01-10", "2", 2);
add("2011-01-10/2011-01-20", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-10", "2", 2),
createExpected("2011-01-10/2011-01-20", "2", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|---------|
// 1|----|----|
@Test
public void testOverlapFirstContainsSecond()
{
add("2011-01-10/2011-01-20", "2", 3);
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-01/2011-01-10", "2", 2);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-10", "2", 2),
createExpected("2011-01-10/2011-01-20", "2", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|----|
// 2|----|
// 3|----|
@Test
public void testOverlapLayeredAscending()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-05/2011-01-15", "2", 2);
add("2011-01-15/2011-01-25", "3", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 1),
createExpected("2011-01-05/2011-01-15", "2", 2),
createExpected("2011-01-15/2011-01-25", "3", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-25"))
);
}
// 3|----|
// 2|----|
// 1|----|
@Test
public void testOverlapLayeredDescending()
{
add("2011-01-15/2011-01-25", "3", 3);
add("2011-01-05/2011-01-15", "2", 2);
add("2011-01-01/2011-01-10", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 1),
createExpected("2011-01-05/2011-01-15", "2", 2),
createExpected("2011-01-15/2011-01-25", "3", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-25"))
);
}
// 2|----| |----|
// 1|-------------|
@Test
public void testOverlapV1Large()
{
add("2011-01-01/2011-01-15", "1", 1);
add("2011-01-03/2011-01-05", "2", 2);
add("2011-01-13/2011-01-20", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-03", "1", 1),
createExpected("2011-01-03/2011-01-05", "2", 2),
createExpected("2011-01-05/2011-01-13", "1", 1),
createExpected("2011-01-13/2011-01-20", "2", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|-------------|
// 1|----| |----|
@Test
public void testOverlapV2Large()
{
add("2011-01-01/2011-01-15", "2", 1);
add("2011-01-03/2011-01-05", "1", 2);
add("2011-01-13/2011-01-20", "1", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-15", "2", 1),
createExpected("2011-01-15/2011-01-20", "1", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|-------------|
// 2|----| |----|
@Test
public void testOverlapV1LargeIsAfter()
{
add("2011-01-03/2011-01-20", "1", 1);
add("2011-01-01/2011-01-05", "2", 2);
add("2011-01-13/2011-01-17", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "2", 2),
createExpected("2011-01-05/2011-01-13", "1", 1),
createExpected("2011-01-13/2011-01-17", "2", 3),
createExpected("2011-01-17/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|----| |----|
// 1|-------------|
@Test
public void testOverlapV1SecondLargeIsAfter()
{
add("2011-01-13/2011-01-17", "2", 3);
add("2011-01-01/2011-01-05", "2", 2);
add("2011-01-03/2011-01-20", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "2", 2),
createExpected("2011-01-05/2011-01-13", "1", 1),
createExpected("2011-01-13/2011-01-17", "2", 3),
createExpected("2011-01-17/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 1|-----------|
// 2|----| |----|
@Test
public void testOverlapV1FirstBetween()
{
add("2011-01-03/2011-01-17", "1", 1);
add("2011-01-01/2011-01-05", "2", 2);
add("2011-01-15/2011-01-20", "2", 3);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "2", 2),
createExpected("2011-01-05/2011-01-15", "1", 1),
createExpected("2011-01-15/2011-01-20", "2", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 2|----| |----|
// 1|-----------|
@Test
public void testOverlapV1SecondBetween()
{
add("2011-01-01/2011-01-05", "2", 2);
add("2011-01-15/2011-01-20", "2", 3);
add("2011-01-03/2011-01-17", "1", 1);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "2", 2),
createExpected("2011-01-05/2011-01-15", "1", 1),
createExpected("2011-01-15/2011-01-20", "2", 3)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
// 4|---|
// 3|---|
// 2|---|
// 1|-------------|
@Test
public void testOverlapLargeUnderlyingWithSmallDayAlignedOverlays()
{
add("2011-01-01/2011-01-05", "1", 1);
add("2011-01-03/2011-01-04", "2", 2);
add("2011-01-04/2011-01-05", "3", 3);
add("2011-01-05/2011-01-06", "4", 4);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-03", "1", 1),
createExpected("2011-01-03/2011-01-04", "2", 2),
createExpected("2011-01-04/2011-01-05", "3", 3),
createExpected("2011-01-05/2011-01-06", "4", 4)
),
timeline.lookup(Intervals.ETERNITY)
);
}
// |----3---||---1---|
// |---2---|
@Test
public void testOverlapCausesNullEntries()
{
add("2011-01-01T12/2011-01-02", "3", 3);
add("2011-01-02/3011-01-03", "1", 1);
add("2011-01-01/2011-01-02", "2", 2);
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-01T12", "2", 2),
createExpected("2011-01-01T12/2011-01-02", "3", 3),
createExpected("2011-01-02/3011-01-03", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/3011-01-03"))
);
}
// 1|----| |----|
// 2|------| |------|
// 3|------------------|
@Test
public void testOverlapOvershadowedThirdContains()
{
add("2011-01-03/2011-01-06", "1", 1);
add("2011-01-09/2011-01-12", "1", 2);
add("2011-01-02/2011-01-08", "2", 3);
add("2011-01-10/2011-01-16", "2", 4);
add("2011-01-01/2011-01-20", "3", 5);
assertValues(
Sets.newHashSet(
createExpected("2011-01-02/2011-01-08", "2", 3),
createExpected("2011-01-10/2011-01-16", "2", 4),
createExpected("2011-01-03/2011-01-06", "1", 1),
createExpected("2011-01-09/2011-01-12", "1", 2)
),
timeline.findFullyOvershadowed()
);
}
// 2|------|------|
// 1|-------------|
// 3|-------------|
@Test
public void testOverlapOvershadowedAligned()
{
add("2011-01-01/2011-01-05", "2", 1);
add("2011-01-05/2011-01-10", "2", 2);
add("2011-01-01/2011-01-10", "1", 3);
add("2011-01-01/2011-01-10", "3", 4);
assertValues(
Sets.newHashSet(
createExpected("2011-01-01/2011-01-05", "2", 1),
createExpected("2011-01-05/2011-01-10", "2", 2),
createExpected("2011-01-01/2011-01-10", "1", 3)
),
timeline.findFullyOvershadowed()
);
}
// 2|----| |-----|
// 1|---------|
// 3|-----------|
@Test
public void testOverlapOvershadowedSomeComplexOverlapsCantThinkOfBetterName()
{
add("2011-01-01/2011-01-05", "2", 1);
add("2011-01-10/2011-01-15", "2", 2);
add("2011-01-03/2011-01-12", "1", 3);
add("2011-01-01/2011-01-10", "3", 4);
assertValues(
Sets.newHashSet(
createExpected("2011-01-03/2011-01-12", "1", 3),
createExpected("2011-01-01/2011-01-05", "2", 1)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOverlapAndRemove()
{
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-10/2011-01-15", "2", 2);
timeline.remove(Intervals.of("2011-01-10/2011-01-15"), "2", makeSingle("2", 2));
assertValues(
Collections.singletonList(
createExpected("2011-01-01/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
@Test
public void testOverlapAndRemove2()
{
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-10/2011-01-20", "2", 2);
add("2011-01-20/2011-01-30", "3", 4);
timeline.remove(Intervals.of("2011-01-10/2011-01-20"), "2", makeSingle("2", 2));
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-20", "1", 1),
createExpected("2011-01-20/2011-01-30", "3", 4)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-30"))
);
}
@Test
public void testOverlapAndRemove3()
{
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-02/2011-01-03", "2", 2);
add("2011-01-10/2011-01-14", "2", 3);
timeline.remove(Intervals.of("2011-01-02/2011-01-03"), "2", makeSingle("2", 2));
timeline.remove(Intervals.of("2011-01-10/2011-01-14"), "2", makeSingle("2", 3));
assertValues(
Collections.singletonList(
createExpected("2011-01-01/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
@Test
public void testOverlapAndRemove4()
{
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-10/2011-01-15", "2", 2);
add("2011-01-15/2011-01-20", "2", 3);
timeline.remove(Intervals.of("2011-01-15/2011-01-20"), "2", makeSingle("2", 3));
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-10", "1", 1),
createExpected("2011-01-10/2011-01-15", "2", 2),
createExpected("2011-01-15/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
@Test
public void testOverlapAndRemove5()
{
add("2011-01-01/2011-01-20", "1", 1);
add("2011-01-10/2011-01-15", "2", 2);
timeline.remove(Intervals.of("2011-01-10/2011-01-15"), "2", makeSingle("2", 2));
add("2011-01-01/2011-01-20", "1", 1);
assertValues(
Collections.singletonList(
createExpected("2011-01-01/2011-01-20", "1", 1)
),
timeline.lookup(Intervals.of("2011-01-01/2011-01-20"))
);
}
@Test
public void testRemoveNothingBacking()
{
add("2011-01-01/2011-01-05", "1", 1);
add("2011-01-05/2011-01-10", "2", 2);
add("2011-01-10/2011-01-15", "3", 3);
add("2011-01-15/2011-01-20", "4", 4);
timeline.remove(Intervals.of("2011-01-15/2011-01-20"), "4", makeSingle("4", 4));
assertValues(
Arrays.asList(
createExpected("2011-01-01/2011-01-05", "1", 1),
createExpected("2011-01-05/2011-01-10", "2", 2),
createExpected("2011-01-10/2011-01-15", "3", 3)
),
timeline.lookup(new Interval(DateTimes.EPOCH, DateTimes.MAX))
);
}
@Test
public void testOvershadowingHigherVersionWins1()
{
add("2011-04-01/2011-04-03", "1", 2);
add("2011-04-03/2011-04-06", "1", 3);
add("2011-04-06/2011-04-09", "1", 4);
add("2011-04-01/2011-04-09", "2", 1);
assertValues(
ImmutableSet.of(
createExpected("2011-04-01/2011-04-03", "1", 2),
createExpected("2011-04-03/2011-04-06", "1", 3),
createExpected("2011-04-06/2011-04-09", "1", 4)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionWins2()
{
add("2011-04-01/2011-04-09", "1", 1);
add("2011-04-01/2011-04-03", "2", 2);
add("2011-04-03/2011-04-06", "2", 3);
add("2011-04-06/2011-04-09", "2", 4);
assertValues(
ImmutableSet.of(
createExpected("2011-04-01/2011-04-09", "1", 1)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionWins3()
{
add("2011-04-01/2011-04-03", "1", 2);
add("2011-04-03/2011-04-06", "1", 3);
add("2011-04-09/2011-04-12", "1", 4);
add("2011-04-01/2011-04-12", "2", 1);
assertValues(
Sets.newHashSet(
createExpected("2011-04-01/2011-04-03", "1", 2),
createExpected("2011-04-03/2011-04-06", "1", 3),
createExpected("2011-04-09/2011-04-12", "1", 4)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionWins4()
{
add("2011-04-03/2011-04-06", "1", 3);
add("2011-04-06/2011-04-09", "1", 4);
add("2011-04-01/2011-04-09", "2", 1);
assertValues(
ImmutableSet.of(
createExpected("2011-04-03/2011-04-06", "1", 3),
createExpected("2011-04-06/2011-04-09", "1", 4)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionNeverOvershadowedByLower1()
{
add("2011-04-01/2011-04-09", "1", 1);
add("2011-04-03/2011-04-06", "2", 3);
add("2011-04-06/2011-04-09", "2", 4);
assertValues(
ImmutableSet.of(),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionNeverOvershadowedByLower2()
{
add("2011-04-01/2011-04-09", "1", 1);
add("2011-04-01/2011-04-03", "2", 2);
add("2011-04-06/2011-04-09", "2", 4);
assertValues(
ImmutableSet.of(),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionNeverOvershadowedByLower3()
{
add("2011-04-01/2011-04-09", "1", 1);
add("2011-04-01/2011-04-03", "2", 2);
add("2011-04-03/2011-04-06", "2", 3);
assertValues(
ImmutableSet.of(),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionNeverOvershadowedByLower4()
{
add("2011-04-01/2011-04-09", "2", 1);
add("2011-04-01/2011-04-03", "3", 2);
add("2011-04-03/2011-04-06", "4", 3);
add("2011-04-03/2011-04-06", "1", 3);
assertValues(
ImmutableSet.of(
createExpected("2011-04-03/2011-04-06", "1", 3)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingHigherVersionNeverOvershadowedByLower5()
{
add("2011-04-01/2011-04-12", "2", 1);
add("2011-04-01/2011-04-03", "3", 2);
add("2011-04-06/2011-04-09", "4", 3);
add("2011-04-09/2011-04-12", "1", 3);
add("2011-04-03/2011-04-06", "1", 3);
assertValues(
Sets.newHashSet(
createExpected("2011-04-03/2011-04-06", "1", 3),
createExpected("2011-04-09/2011-04-12", "1", 3)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingSameIntervalHighVersionWins()
{
add("2011-04-01/2011-04-09", "1", 1);
add("2011-04-01/2011-04-09", "9", 2);
add("2011-04-01/2011-04-09", "2", 3);
assertValues(
Sets.newHashSet(
createExpected("2011-04-01/2011-04-09", "2", 3),
createExpected("2011-04-01/2011-04-09", "1", 1)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowingSameIntervalSameVersionAllKept()
{
add("2011-04-01/2011-04-09", "1", 1);
add("2011-04-01/2011-04-09", "9", 2);
add("2011-04-01/2011-04-09", "2", 3);
add("2011-04-01/2011-04-09", "9", 4);
assertValues(
Sets.newHashSet(
createExpected("2011-04-01/2011-04-09", "2", 3),
createExpected("2011-04-01/2011-04-09", "1", 1)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testNotFoundReturnsEmpty()
{
add("2011-04-01/2011-04-09", "1", 1);
Assert.assertTrue(timeline.lookup(Intervals.of("1970/1980")).isEmpty());
}
/** https://github.com/apache/druid/issues/3010 */
@Test
public void testRemoveIncompleteKeepsComplete()
{
add("2011-04-01/2011-04-02", "1", IntegerPartitionChunk.make(null, 1, 0, new OvershadowableInteger("1", 0, 77)));
add("2011-04-01/2011-04-02", "1", IntegerPartitionChunk.make(1, null, 1, new OvershadowableInteger("1", 1, 88)));
add("2011-04-01/2011-04-02", "2", IntegerPartitionChunk.make(null, 1, 0, new OvershadowableInteger("2", 0, 99)));
assertValues(
ImmutableList.of(
createExpected("2011-04-01/2011-04-02", "1",
Arrays.asList(
IntegerPartitionChunk.make(null, 1, 0, new OvershadowableInteger("1", 0, 77)),
IntegerPartitionChunk.make(1, null, 1, new OvershadowableInteger("1", 1, 88))
)
)
),
timeline.lookup(Intervals.of("2011-04-01/2011-04-02"))
);
add("2011-04-01/2011-04-02", "3", IntegerPartitionChunk.make(null, 1, 0, new OvershadowableInteger("3", 0, 110)));
assertValues(
ImmutableList.of(
createExpected("2011-04-01/2011-04-02", "1",
Arrays.asList(
IntegerPartitionChunk.make(null, 1, 0, new OvershadowableInteger("1", 0, 77)),
IntegerPartitionChunk.make(1, null, 1, new OvershadowableInteger("1", 1, 88))
)
)
),
timeline.lookup(Intervals.of("2011-04-01/2011-04-02"))
);
assertValues(
Sets.newHashSet(
createExpected("2011-04-01/2011-04-02", "2",
Collections.singletonList(
IntegerPartitionChunk.make(null, 1, 0, new OvershadowableInteger("2", 0, 99))
)
)
),
timeline.findFullyOvershadowed()
);
checkRemove();
assertValues(
ImmutableList.of(
createExpected("2011-04-01/2011-04-02", "1",
Arrays.asList(
IntegerPartitionChunk.make(null, 1, 0, new OvershadowableInteger("1", 0, 77)),
IntegerPartitionChunk.make(1, null, 1, new OvershadowableInteger("1", 1, 88))
)
)
),
timeline.lookup(Intervals.of("2011-04-01/2011-04-02"))
);
}
@Test
public void testIsOvershadowedWithNonOverlappingSegmentsInTimeline()
{
add("2011-04-05/2011-04-07", "1", makeSingle("1", 1));
add("2011-04-07/2011-04-09", "1", makeSingle("1", 1));
add("2011-04-15/2011-04-17", "1", makeSingle("1", 1));
add("2011-04-17/2011-04-19", "1", makeSingle("1", 1));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-03"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-05"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-06"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-07"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-08"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-30"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-06"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-07"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-08"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-06"), "1", new OvershadowableInteger("1", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-07"), "1", new OvershadowableInteger("1", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-08"), "1", new OvershadowableInteger("1", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-09"), "1", new OvershadowableInteger("1", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-06"), "2", new OvershadowableInteger("2", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-07"), "2", new OvershadowableInteger("2", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-08"), "2", new OvershadowableInteger("2", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-09"), "2", new OvershadowableInteger("2", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-07"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-08"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-30"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-07/2011-04-08"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-07/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-07/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-07/2011-04-30"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-08/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-08/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-08/2011-04-30"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-09/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-09/2011-04-15"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-09/2011-04-17"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-09/2011-04-19"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-09/2011-04-30"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-15/2011-04-16"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-15/2011-04-17"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-15/2011-04-18"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-15/2011-04-19"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-15/2011-04-20"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-15/2011-04-30"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-19/2011-04-20"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-21/2011-04-22"), "0", new OvershadowableInteger("0", 0, 1)));
}
@Test
public void testIsOvershadowedWithOverlappingSegmentsInTimeline()
{
add("2011-04-05/2011-04-09", "11", makeSingle("11", 1));
add("2011-04-07/2011-04-11", "12", makeSingle("12", 1));
add("2011-04-15/2011-04-19", "12", makeSingle("12", 1));
add("2011-04-17/2011-04-21", "11", makeSingle("11", 1));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-03"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-05"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-06"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-07"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-08"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-11"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-01/2011-04-30"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-06"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-07"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-08"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-11"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-06"), "12", new OvershadowableInteger("12", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-07"), "12", new OvershadowableInteger("12", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-08"), "12", new OvershadowableInteger("12", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-09"), "12", new OvershadowableInteger("12", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-10"), "12", new OvershadowableInteger("12", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-11"), "12", new OvershadowableInteger("12", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-06"), "13", new OvershadowableInteger("13", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-07"), "13", new OvershadowableInteger("13", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-08"), "13", new OvershadowableInteger("13", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-09"), "13", new OvershadowableInteger("13", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-10"), "13", new OvershadowableInteger("13", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-11"), "13", new OvershadowableInteger("13", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-12"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-15"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-16"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-17"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-18"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-19"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-20"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-21"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-05/2011-04-22"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-07"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-08"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-09"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-10"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-11"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-12"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-15"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-16"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-17"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-18"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-19"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-20"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-21"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-06/2011-04-22"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-15"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-16"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-17"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-18"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-19"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-20"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-21"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-12/2011-04-22"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertTrue(timeline.isOvershadowed(Intervals.of("2011-04-15/2011-04-21"), "0", new OvershadowableInteger("0", 0, 1)));
Assert.assertFalse(timeline.isOvershadowed(Intervals.of("2011-04-21/2011-04-22"), "0", new OvershadowableInteger("0", 0, 1)));
}
@Test
public void testOvershadowedByReference()
{
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 0, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 1, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 2, 0));
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 0, 1, 0, 3, 1, 2));
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 1, 1, 0, 3, 1, 2));
Assert.assertEquals(
ImmutableSet.of(
makeTimelineObjectHolder(
"2019-01-01/2019-01-02",
"0",
ImmutableList.of(makeNumbered("0", 0, 0), makeNumbered("0", 1, 0), makeNumbered("0", 2, 0))
)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowedByReferenceChain()
{
// 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 0, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 1, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 2, 0));
// 2019-01-02/2019-01-03
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 0, 0));
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 1, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 0, 1, 0, 3, 1, 2));
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 1, 1, 0, 3, 1, 2));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 2, 2, 0, 3, 2, 2));
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 3, 2, 0, 3, 2, 2));
Assert.assertEquals(
ImmutableSet.of(
makeTimelineObjectHolder(
"2019-01-01/2019-01-02",
"0",
ImmutableList.of(
makeNumbered("0", 0, 0),
makeNumbered("0", 1, 0),
makeNumbered("0", 2, 0),
makeNumberedOverwriting("0", 0, 1, 0, 3, 1, 2),
makeNumberedOverwriting("0", 1, 1, 0, 3, 1, 2)
)
)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowedByReferenceAndThenVersion()
{
// 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 0, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 1, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 2, 0));
// 2019-01-02/2019-01-03
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 0, 0));
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 1, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 0, 1, 0, 3, 1, 2));
add("2019-01-01/2019-01-02", "0", makeNumberedOverwriting("0", 1, 1, 0, 3, 1, 2));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 0, 0));
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 1, 0));
Assert.assertEquals(
ImmutableSet.of(
makeTimelineObjectHolder(
"2019-01-01/2019-01-02",
"0",
ImmutableList.of(
makeNumbered("0", 0, 0),
makeNumbered("0", 1, 0),
makeNumbered("0", 2, 0),
makeNumberedOverwriting("0", 0, 1, 0, 3, 1, 2),
makeNumberedOverwriting("0", 1, 1, 0, 3, 1, 2)
)
)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testOvershadowedByVersionAndThenReference()
{
// 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 0, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 1, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 2, 0));
// 2019-01-02/2019-01-03
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 0, 0));
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 1, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 0, 0));
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 1, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 0, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 1, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 2, 1, 0, 2, 1, 3));
Assert.assertEquals(
ImmutableSet.of(
makeTimelineObjectHolder(
"2019-01-01/2019-01-02",
"0",
ImmutableList.of(
makeNumbered("0", 0, 0),
makeNumbered("0", 1, 0),
makeNumbered("0", 2, 0)
)
),
makeTimelineObjectHolder(
"2019-01-01/2019-01-02",
"1",
ImmutableList.of(
makeNumbered("1", 0, 0),
makeNumbered("1", 1, 0)
)
)
),
timeline.findFullyOvershadowed()
);
}
@Test
public void testFallbackOnMissingSegment()
{
final Interval interval = Intervals.of("2019-01-01/2019-01-02");
add(interval, "0", makeNumbered("0", 0, 0));
add(interval, "0", makeNumbered("0", 1, 0));
add(interval, "0", makeNumbered("0", 2, 0));
// Overwrite 2019-01-01/2019-01-02
add(interval, "1", makeNumbered("1", 0, 0));
add(interval, "1", makeNumbered("1", 1, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 0, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 1, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 2, 1, 0, 2, 1, 3));
timeline.remove(
interval,
"1",
makeNumberedOverwriting("1", 2, 1, 0, 2, 1, 3)
);
final List<TimelineObjectHolder<String, OvershadowableInteger>> holders = timeline.lookup(interval);
Assert.assertEquals(
ImmutableList.of(
new TimelineObjectHolder<>(
interval,
"1",
new PartitionHolder<>(
ImmutableList.of(
makeNumbered("1", 0, 0),
makeNumbered("1", 1, 0)
)
)
)
),
holders
);
}
@Test
public void testAddSameChunkToFullAtomicUpdateGroup()
{
final Interval interval = Intervals.of("2019-01-01/2019-01-02");
add(interval, "0", makeNumbered("0", 0, 0));
add(interval, "0", makeNumberedOverwriting("0", 0, 0, 0, 1, 1, 1));
add(interval, "0", makeNumbered("0", 0, 1));
final Set<TimelineObjectHolder<String, OvershadowableInteger>> overshadowed = timeline.findFullyOvershadowed();
Assert.assertEquals(
ImmutableSet.of(
new TimelineObjectHolder<>(
interval,
"0",
new PartitionHolder<>(ImmutableList.of(makeNumbered("0", 0, 1)))
)
),
overshadowed
);
}
@Test
public void testOvershadowMultipleStandbyAtomicUpdateGroup()
{
final Interval interval = Intervals.of("2019-01-01/2019-01-02");
add(interval, "0", makeNumberedOverwriting("0", 0, 0, 0, 1, 1, 2));
add(interval, "0", makeNumberedOverwriting("0", 1, 0, 0, 1, 2, 2));
add(interval, "0", makeNumberedOverwriting("0", 2, 0, 0, 1, 3, 2)); // <-- full atomicUpdateGroup
add(interval, "0", makeNumberedOverwriting("0", 3, 1, 0, 1, 3, 2)); // <-- full atomicUpdateGroup
final Set<TimelineObjectHolder<String, OvershadowableInteger>> overshadowed = timeline.findFullyOvershadowed();
Assert.assertEquals(
ImmutableSet.of(
new TimelineObjectHolder<>(
interval,
"0",
new PartitionHolder<>(
ImmutableList.of(
makeNumberedOverwriting("0", 0, 0, 0, 1, 1, 2),
makeNumberedOverwriting("0", 1, 0, 0, 1, 2, 2)
)
)
)
),
overshadowed
);
}
@Test
public void testIsOvershadowedForOverwritingSegments()
{
final Interval interval = Intervals.of("2019-01-01/2019-01-02");
add(interval, "0", makeNumberedOverwriting("0", 0, 0, 5, 10, 10, 1));
for (int i = 0; i < 5; i++) {
Assert.assertTrue(timeline.isOvershadowed(interval, "0", makeNumbered("0", i + 5, 0).getObject()));
}
Assert.assertFalse(timeline.isOvershadowed(interval, "0", makeNumbered("0", 4, 0).getObject()));
Assert.assertFalse(timeline.isOvershadowed(interval, "0", makeNumbered("0", 11, 0).getObject()));
Assert.assertTrue(timeline.isOvershadowed(interval, "0", makeNumberedOverwriting("0", 1, 0, 5, 6, 5, 2).getObject()));
Assert.assertTrue(timeline.isOvershadowed(interval, "0", makeNumberedOverwriting("0", 1, 0, 7, 8, 5, 2).getObject()));
Assert.assertTrue(timeline.isOvershadowed(interval, "0", makeNumberedOverwriting("0", 1, 0, 8, 10, 5, 2).getObject()));
Assert.assertFalse(timeline.isOvershadowed(interval, "0", makeNumberedOverwriting("0", 1, 0, 5, 10, 12, 2).getObject()));
Assert.assertFalse(timeline.isOvershadowed(interval, "0", makeNumberedOverwriting("0", 1, 0, 4, 15, 12, 2).getObject()));
}
@Test
public void testIterateAllObjects()
{
add("2011-01-01/2011-01-10", "1", 1);
add("2011-01-01/2011-01-10", "2", 3);
Collection<OvershadowableInteger> overshadowableIntegers = timeline.iterateAllObjects();
Assert.assertEquals(2, overshadowableIntegers.size());
// Tests that the "iteration" size of the returned collection is 2 (the "reported" size from size() method may be
// deceptive).
Assert.assertEquals(2, Lists.newArrayList(overshadowableIntegers.iterator()).size());
}
@Test
public void testFindNonOvershadowedObjectsInIntervalWithOnlyCompletePartitionsReturningValidResult()
{
// 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 0, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 1, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 2, 0));
// 2019-01-02/2019-01-03
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 0, 0));
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 1, 0));
// Incomplete partitions
add("2019-01-03/2019-01-04", "0", makeNumbered("2", 0, 3, 0));
add("2019-01-03/2019-01-04", "0", makeNumbered("2", 1, 3, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 0, 0));
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 1, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 0, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 1, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 2, 1, 0, 2, 1, 3));
Assert.assertEquals(
ImmutableSet.of(
makeNumberedOverwriting("1", 0, 1, 0, 2, 1, 3).getObject(),
makeNumberedOverwriting("1", 1, 1, 0, 2, 1, 3).getObject(),
makeNumberedOverwriting("1", 2, 1, 0, 2, 1, 3).getObject(),
makeNumbered("0", 0, 0).getObject(),
makeNumbered("0", 1, 0).getObject()
),
timeline.findNonOvershadowedObjectsInInterval(Intervals.of("2019-01-01/2019-01-04"), Partitions.ONLY_COMPLETE)
);
}
@Test
public void testFindNonOvershadowedObjectsInIntervalWithIncompleteOkReturningValidResult()
{
// 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 0, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 1, 0));
add("2019-01-01/2019-01-02", "0", makeNumbered("0", 2, 0));
// 2019-01-02/2019-01-03
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 0, 0));
add("2019-01-02/2019-01-03", "0", makeNumbered("0", 1, 0));
// Incomplete partitions
add("2019-01-03/2019-01-04", "0", makeNumbered("2", 0, 3, 0));
add("2019-01-03/2019-01-04", "0", makeNumbered("2", 1, 3, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 0, 0));
add("2019-01-01/2019-01-02", "1", makeNumbered("1", 1, 0));
// Overwrite 2019-01-01/2019-01-02
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 0, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 1, 1, 0, 2, 1, 3));
add("2019-01-01/2019-01-02", "1", makeNumberedOverwriting("1", 2, 1, 0, 2, 1, 3));
Assert.assertEquals(
ImmutableSet.of(
makeNumberedOverwriting("1", 0, 1, 0, 2, 1, 3).getObject(),
makeNumberedOverwriting("1", 1, 1, 0, 2, 1, 3).getObject(),
makeNumberedOverwriting("1", 2, 1, 0, 2, 1, 3).getObject(),
makeNumbered("0", 0, 0).getObject(),
makeNumbered("0", 1, 0).getObject(),
makeNumbered("2", 0, 3, 0).getObject(),
makeNumbered("2", 1, 3, 0).getObject()
),
timeline.findNonOvershadowedObjectsInInterval(Intervals.of("2019-01-01/2019-01-04"), Partitions.INCOMPLETE_OK)
);
}
}