public static PrestoThriftEquatableValueSet fromEquatableValueSet(EquatableValueSet valueSet) { Type type = valueSet.getType(); Set<ValueEntry> values = valueSet.getEntries(); List<PrestoThriftBlock> thriftValues = new ArrayList<>(values.size()); for (ValueEntry value : values) { checkState(type.equals(value.getType()), "ValueEntrySet has elements of different types: %s vs %s", type, value.getType()); thriftValues.add(fromBlock(value.getBlock(), type)); } return new PrestoThriftEquatableValueSet(valueSet.isWhiteList(), thriftValues); } }
@Override public Collection<Object> getValues() { return EquatableValueSet.this.getValues(); } };
@Test public void testUnion() { assertEquals(EquatableValueSet.none(ID).union(EquatableValueSet.none(ID)), EquatableValueSet.none(ID)); assertEquals(EquatableValueSet.all(ID).union(EquatableValueSet.all(ID)), EquatableValueSet.all(ID)); assertEquals(EquatableValueSet.none(ID).union(EquatableValueSet.all(ID)), EquatableValueSet.all(ID)); assertEquals(EquatableValueSet.none(ID).union(EquatableValueSet.of(ID, 0L)), EquatableValueSet.of(ID, 0L)); assertEquals(EquatableValueSet.all(ID).union(EquatableValueSet.of(ID, 0L)), EquatableValueSet.all(ID)); assertEquals(EquatableValueSet.of(ID, 0L).union(EquatableValueSet.of(ID, 0L)), EquatableValueSet.of(ID, 0L)); assertEquals(EquatableValueSet.of(ID, 0L, 1L).union(EquatableValueSet.of(ID, 0L)), EquatableValueSet.of(ID, 0L, 1L)); assertEquals(EquatableValueSet.of(ID, 0L).complement().union(EquatableValueSet.of(ID, 0L)), EquatableValueSet.all(ID)); assertEquals(EquatableValueSet.of(ID, 0L).complement().union(EquatableValueSet.of(ID, 1L)), EquatableValueSet.of(ID, 0L).complement()); assertEquals(EquatableValueSet.of(ID, 0L).union(EquatableValueSet.of(ID, 1L).complement()), EquatableValueSet.of(ID, 1L).complement()); assertEquals(EquatableValueSet.of(ID, 0L, 1L).union(EquatableValueSet.of(ID, 0L, 2L)), EquatableValueSet.of(ID, 0L, 1L, 2L)); assertEquals(EquatableValueSet.of(ID, 0L, 1L).complement().union(EquatableValueSet.of(ID, 0L, 2L)), EquatableValueSet.of(ID, 1L).complement()); assertEquals(EquatableValueSet.of(ID, 0L, 1L).complement().union(EquatableValueSet.of(ID, 0L, 2L).complement()), EquatableValueSet.of(ID, 0L).complement()); }
@Override public EquatableValueSet intersect(ValueSet other) { EquatableValueSet otherValueSet = checkCompatibility(other); if (whiteList && otherValueSet.isWhiteList()) { return new EquatableValueSet(type, true, intersect(entries, otherValueSet.entries)); } else if (whiteList) { return new EquatableValueSet(type, true, subtract(entries, otherValueSet.entries)); } else if (otherValueSet.isWhiteList()) { return new EquatableValueSet(type, true, subtract(otherValueSet.entries, entries)); } else { return new EquatableValueSet(type, false, union(otherValueSet.entries, entries)); } }
@Test public void testGetSingleValue() { assertEquals(EquatableValueSet.of(ID, 0L).getSingleValue(), 0L); try { EquatableValueSet.all(ID).getSingleValue(); fail(); } catch (IllegalStateException ignored) { } }
@Test public void testSingleValue() { EquatableValueSet equatables = EquatableValueSet.of(ID, 10L); EquatableValueSet complement = (EquatableValueSet) EquatableValueSet.all(ID).subtract(equatables); // Whitelist assertEquals(equatables.getType(), ID); assertFalse(equatables.isNone()); assertFalse(equatables.isAll()); assertTrue(equatables.isSingleValue()); assertTrue(equatables.isWhiteList()); assertTrue(Iterables.elementsEqual(equatables.getValues(), ImmutableList.of(10L))); assertEquals(equatables.complement(), complement); assertFalse(equatables.containsValue(0L)); assertFalse(equatables.containsValue(1L)); assertTrue(equatables.containsValue(10L)); // Blacklist assertEquals(complement.getType(), ID); assertFalse(complement.isNone()); assertFalse(complement.isAll()); assertFalse(complement.isSingleValue()); assertFalse(complement.isWhiteList()); assertTrue(Iterables.elementsEqual(complement.getValues(), ImmutableList.of(10L))); assertEquals(complement.complement(), equatables); assertTrue(complement.containsValue(0L)); assertTrue(complement.containsValue(1L)); assertFalse(complement.containsValue(10L)); }
@Test public void testEntireSet() { EquatableValueSet equatables = EquatableValueSet.all(ID); assertEquals(equatables.getType(), ID); assertFalse(equatables.isNone()); assertTrue(equatables.isAll()); assertFalse(equatables.isSingleValue()); assertFalse(equatables.isWhiteList()); assertEquals(equatables.getValues().size(), 0); assertEquals(equatables.complement(), EquatableValueSet.none(ID)); assertTrue(equatables.containsValue(0L)); assertTrue(equatables.containsValue(1L)); }
@Test(expectedExceptions = UnsupportedOperationException.class) public void testUnmodifiableValueEntries() { EquatableValueSet.of(ID, 1L).getEntries().clear(); }
@Override public boolean isWhiteList() { return EquatableValueSet.this.isWhiteList(); }
private EquatableValueSet checkCompatibility(ValueSet other) { if (!getType().equals(other.getType())) { throw new IllegalStateException(String.format("Mismatched types: %s vs %s", getType(), other.getType())); } if (!(other instanceof EquatableValueSet)) { throw new IllegalStateException(String.format("ValueSet is not a EquatableValueSet: %s", other.getClass())); } return (EquatableValueSet) other; }
@Override public Object getSingleValue() { if (!isSingleValue()) { throw new IllegalStateException("EquatableValueSet does not have just a single value"); } return entries.iterator().next().getValue(); }
static ValueSet of(Type type, Object first, Object... rest) { if (type.isOrderable()) { return SortedRangeSet.of(type, first, rest); } if (type.isComparable()) { return EquatableValueSet.of(type, first, rest); } throw new IllegalArgumentException("Cannot create discrete ValueSet with non-comparable type: " + type); }
static ValueSet none(Type type) { if (type.isOrderable()) { return SortedRangeSet.none(type); } if (type.isComparable()) { return EquatableValueSet.none(type); } return AllOrNoneValueSet.none(type); }
static ValueSet all(Type type) { if (type.isOrderable()) { return SortedRangeSet.all(type); } if (type.isComparable()) { return EquatableValueSet.all(type); } return AllOrNoneValueSet.all(type); }
@Test public void testSingleValue() { EquatableValueSet equatables = EquatableValueSet.of(ID, 10L); EquatableValueSet complement = (EquatableValueSet) EquatableValueSet.all(ID).subtract(equatables); // Whitelist assertEquals(equatables.getType(), ID); assertFalse(equatables.isNone()); assertFalse(equatables.isAll()); assertTrue(equatables.isSingleValue()); assertTrue(equatables.isWhiteList()); assertTrue(Iterables.elementsEqual(equatables.getValues(), ImmutableList.of(10L))); assertEquals(equatables.complement(), complement); assertFalse(equatables.containsValue(0L)); assertFalse(equatables.containsValue(1L)); assertTrue(equatables.containsValue(10L)); // Blacklist assertEquals(complement.getType(), ID); assertFalse(complement.isNone()); assertFalse(complement.isAll()); assertFalse(complement.isSingleValue()); assertFalse(complement.isWhiteList()); assertTrue(Iterables.elementsEqual(complement.getValues(), ImmutableList.of(10L))); assertEquals(complement.complement(), equatables); assertTrue(complement.containsValue(0L)); assertTrue(complement.containsValue(1L)); assertFalse(complement.containsValue(10L)); }
@Test public void testEmptySet() { EquatableValueSet equatables = EquatableValueSet.none(ID); assertEquals(equatables.getType(), ID); assertTrue(equatables.isNone()); assertFalse(equatables.isAll()); assertFalse(equatables.isSingleValue()); assertTrue(equatables.isWhiteList()); assertEquals(equatables.getValues().size(), 0); assertEquals(equatables.complement(), EquatableValueSet.all(ID)); assertFalse(equatables.containsValue(0L)); assertFalse(equatables.containsValue(1L)); }
@Override public EquatableValueSet union(ValueSet other) { EquatableValueSet otherValueSet = checkCompatibility(other); if (whiteList && otherValueSet.isWhiteList()) { return new EquatableValueSet(type, true, union(entries, otherValueSet.entries)); } else if (whiteList) { return new EquatableValueSet(type, false, subtract(otherValueSet.entries, entries)); } else if (otherValueSet.isWhiteList()) { return new EquatableValueSet(type, false, subtract(entries, otherValueSet.entries)); } else { return new EquatableValueSet(type, false, intersect(otherValueSet.entries, entries)); } }
@Test(expectedExceptions = UnsupportedOperationException.class) public void testUnmodifiableValueEntries() { EquatableValueSet.of(ID, 1L).getEntries().clear(); }