package com.yahoo.glimmer.indexing.generator;
/*
* Copyright (c) 2012 Yahoo! Inc. All rights reserved.
*
* Licensed 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.
* See accompanying LICENSE file.
*/
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import org.apache.hadoop.io.RawComparator;
import org.junit.Before;
import org.junit.Test;
import com.yahoo.glimmer.indexing.generator.TermValue.Type;
public class TermKeyTest {
private ByteArrayOutputStream byteArrayOutputStream;
private DataOutput dataOutput;
private RawComparator<?> comparator;
@Before
public void before() {
byteArrayOutputStream = new ByteArrayOutputStream(4096);
dataOutput = new DataOutputStream(byteArrayOutputStream);
}
@Test
public void comparatorTest() throws IOException {
comparator = new TermKey.Comparator();
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67))));
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 66))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 68))) < 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 5, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 7, 67))) < 0);
assertEquals(0, compare(new TermKey("a", 4, new TermValue(Type.OCCURRENCE, Integer.MAX_VALUE + 6l, 67)), new TermKey("a", 4, new TermValue(Type.OCCURRENCE, Integer.MAX_VALUE + 6l, 67))));
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, Integer.MAX_VALUE + 6l, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, Integer.MAX_VALUE + 5l, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, Integer.MAX_VALUE + 6l, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, Integer.MAX_VALUE + 7l, 67))) < 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, Integer.MAX_VALUE + 6l, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6l, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6)), new TermKey("term1", 4, new TermValue(Type.TERM_STATS, 6, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.TERM_STATS, 6, 67)), new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6))) < 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67))) < 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 3, new TermValue(Type.OCCURRENCE, 6, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 5, new TermValue(Type.OCCURRENCE, 6, 67))) < 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term0", 4, new TermValue(Type.OCCURRENCE, 6, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term2", 4, new TermValue(Type.OCCURRENCE, 6, 67))) < 0);
assertEquals(0, compare(new TermKey("", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("", 4, new TermValue(Type.OCCURRENCE, 6, 67))));
assertTrue(compare(new TermKey("aa", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("a", 4, new TermValue(Type.OCCURRENCE, 6, 67))) > 0);
assertTrue(compare(new TermKey("", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("a", 4, new TermValue(Type.OCCURRENCE, 6, 67))) < 0);
}
@Test
public void groupTest() throws IOException {
comparator = new TermKey.FirstGroupingComparator();
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 66))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 68))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 5, 67))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 7, 67))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6)), new TermKey("term1", 4, new TermValue(Type.TERM_STATS, 6, 67))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.TERM_STATS, 6, 67)), new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6))));
assertEquals(0, compare(new TermKey("term1", 4, new TermValue(Type.INDEX_ID, 6)), new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67))));
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 3, new TermValue(Type.OCCURRENCE, 6, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term1", 5, new TermValue(Type.OCCURRENCE, 6, 67))) < 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term0", 4, new TermValue(Type.OCCURRENCE, 6, 67))) > 0);
assertTrue(compare(new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("term2", 4, new TermValue(Type.OCCURRENCE, 6, 67))) < 0);
assertEquals(0, compare(new TermKey("", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("", 4, new TermValue(Type.OCCURRENCE, 6, 67))));
assertTrue(compare(new TermKey("aa", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("a", 4, new TermValue(Type.OCCURRENCE, 6, 67))) > 0);
assertTrue(compare(new TermKey("", 4, new TermValue(Type.OCCURRENCE, 6, 67)), new TermKey("a", 4, new TermValue(Type.OCCURRENCE, 6, 67))) < 0);
}
private int compare(TermKey a, TermKey b) throws IOException {
byteArrayOutputStream.reset();
a.write(dataOutput);
int aSize = byteArrayOutputStream.size();
b.write(dataOutput);
int bSize = byteArrayOutputStream.size() - aSize;
byte[] byteArray = byteArrayOutputStream.toByteArray();
return comparator.compare(byteArray, 0, aSize, byteArray, aSize, bSize);
}
@Test
public void writeReadTest() throws IOException {
PipedInputStream pipedInputStream = new PipedInputStream(1024);
PipedOutputStream pipedOutputStream = new PipedOutputStream(pipedInputStream);
DataInput dataInput = new DataInputStream(pipedInputStream);
DataOutput dataOutput = new DataOutputStream(pipedOutputStream);
TermKey key1 = new TermKey("term1", 4, new TermValue(Type.OCCURRENCE, 6, 67));
key1.write(dataOutput);
TermKey key2 = new TermKey();
key2.readFields(dataInput);
assertEquals(key1, key2);
}
@Test
public void firstPartitionerTest() {
// The hashCode of "node178qbtfd0x20663837" is Integer.MIN_VALUE
TermKey termKey = new TermKey("node178qbtfd0x20663837", 1, new TermValue(TermValue.Type.OCCURRENCE, 1021424687, 1));
TermKey.FirstPartitioner partitioner = new TermKey.FirstPartitioner();
assertEquals(26, partitioner.getPartition(termKey, termKey.getValue(), 30));
}
}