package org.apache.solr.search.xjoin;
/*
* 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.
*/
import static org.apache.commons.collections.IteratorUtils.toList;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
@SuppressWarnings("unchecked")
public class TestCombinations {
Iterator<Integer> e, a, aa, b, bb;
Integer[] es = { };
Integer[] as = { 3, 4, 6, 9 };
Integer[] aas = { 3, 4, 5, 6, 9 };
Integer[] bs = { 1, 2, 5, 8 };
Integer[] bbs = { 1, 2, 3, 5, 8 };
Integer[] cs = { 1, 2, 3, 4, 5, 6, 8, 9 };
Integer[] ds = { 3, 5 };
Integer[] xs = { 1, 2, 4, 6, 8, 9 };
Integer[] ns = { 4, 6, 9 };
@Before
public void setUp() {
e = Arrays.asList(es).iterator();
a = Arrays.asList(as).iterator();
aa = Arrays.asList(aas).iterator();
b = Arrays.asList(bs).iterator();
bb = Arrays.asList(bbs).iterator();
}
@Test
public void testOr() {
List<Integer> cl = toList(Combinations.or(a, b));
assertEquals(Arrays.asList(cs), cl);
}
@Test
public void testOrRepeat() {
List<Integer> cl = toList(Combinations.or(a, bb));
assertEquals(Arrays.asList(cs), cl);
}
@Test
public void testOrRepeat2() {
List<Integer> cl = toList(Combinations.or(aa, b));
assertEquals(Arrays.asList(cs), cl);
}
@Test
public void testOrEmptyA() {
List<Integer> cl = toList(Combinations.or(e, b));
assertEquals(Arrays.asList(bs), cl);
}
@Test
public void testOrEmptyB() {
List<Integer> cl = toList(Combinations.or(a, e));
assertEquals(Arrays.asList(as), cl);
}
@Test
public void testOrEmptyAB() {
List<Integer> cl = toList(Combinations.or(e, e));
assertEquals(Arrays.asList(es), cl);
}
@Test
public void testAnd() {
List<Integer> cl = toList(Combinations.and(aa, bb));
assertEquals(Arrays.asList(ds), cl);
}
@Test
public void testAndEmptyA() {
List<Integer> cl = toList(Combinations.and(e, bb));
assertEquals(Arrays.asList(es), cl);
}
@Test
public void testAndEmptyB() {
List<Integer> cl = toList(Combinations.and(aa, e));
assertEquals(Arrays.asList(es), cl);
}
@Test
public void testAndEmptyAB() {
List<Integer> cl = toList(Combinations.and(e, e));
assertEquals(Arrays.asList(es), cl);
}
@Test
public void testXOr() {
List<Integer> cl = toList(Combinations.xor(a, b));
assertEquals(Arrays.asList(cs), cl);
}
@Test
public void testXOrRepeat() {
List<Integer> cl = toList(Combinations.xor(aa, bb));
assertEquals(Arrays.asList(xs), cl);
}
@Test
public void testAndNot() {
List<Integer> cl = toList(Combinations.andNot(a, b));
assertEquals(Arrays.asList(as), cl);
}
@Test
public void testAndNotRepeat() {
List<Integer> cl = toList(Combinations.andNot(aa, bb));
assertEquals(Arrays.asList(ns), cl);
}
// more of an instructive example of how this will be used in XJoinQParserPlugin
@Test
public void testHetero() {
List<Foo> A_36 = Foo.range("A", 3, 6);
List<Foo> A_48 = Foo.range("A", 4, 8);
List<Foo> B_17 = Foo.range("B", 1, 7);
// so, different types shouldn't get mingled
List<Foo> A_36_B_17 = Foo.range("A", 3, 6);
A_36_B_17.addAll(Foo.range("B", 1, 7));
assertEquals(A_36_B_17, toList(Combinations.or(A_36.iterator(), B_17.iterator())));
assertEquals(0, toList(Combinations.and(A_36.iterator(), B_17.iterator())).size());
// but check that the same type does
List<Foo> A_38 = Foo.range("A", 3, 8);
assertEquals(A_38, toList(Combinations.or(A_36.iterator(), A_48.iterator())));
Iterator<Foo> A_or_B = Combinations.or(A_48.iterator(), B_17.iterator());
assertEquals(3, toList(Combinations.and(A_36.iterator(), A_or_B)).size());
}
static class Foo implements Comparable<Foo> {
String type;
int value;
static List<Foo> range(String type, int m, int n) {
List<Foo> f = new ArrayList<Foo>(n - m + 1);
for (int i = 0; i <= n - m; ++i) {
Foo foo = new Foo();
foo.type = type;
foo.value = m + i;
f.add(foo);
}
return f;
}
@Override
public int compareTo(Foo that) {
int v = this.type.compareTo(that.type);
if (v != 0) {
return v;
}
return new Integer(this.value).compareTo(that.value);
}
@Override
public boolean equals(Object that) {
return that instanceof Foo && compareTo((Foo)that) == 0;
}
}
}