/* * Copyright (C) 2014 Indeed Inc. * * 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. */ package com.indeed.imhotep; import com.indeed.imhotep.service.FTGSOutputStreamWriter; import junit.framework.TestCase; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class InputStreamFTGSIteratorTest extends TestCase { @Test public void testNegative() throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); FTGSOutputStreamWriter w = new FTGSOutputStreamWriter(out); w.switchField("a", true); w.switchIntTerm(1, 5); w.switchGroup(1); w.addStat(-5); w.addStat(-10); w.switchField("b", true); w.switchIntTerm(1, 5); w.switchGroup(1); w.addStat(5); w.addStat(-999999); w.close(); InputStreamFTGSIterator iter = new InputStreamFTGSIterator(new ByteArrayInputStream(out.toByteArray()), 2); assertTrue(iter.nextField()); assertEquals("a", iter.fieldName()); assertTrue(iter.fieldIsIntType()); assertTrue(iter.nextTerm()); assertEquals(1, iter.termIntVal()); assertEquals(5L, iter.termDocFreq()); assertTrue(iter.nextGroup()); assertEquals(1, iter.group()); long[] stats = new long[2]; iter.groupStats(stats); assertEquals(-5L, stats[0]); assertEquals(-10L, stats[1]); assertFalse(iter.nextGroup()); assertFalse(iter.nextTerm()); assertTrue(iter.nextField()); assertEquals("b", iter.fieldName()); assertTrue(iter.fieldIsIntType()); assertTrue(iter.nextTerm()); assertEquals(1, iter.termIntVal()); assertEquals(5L, iter.termDocFreq()); assertTrue(iter.nextGroup()); assertEquals(1, iter.group()); iter.groupStats(stats); assertEquals(5L, stats[0]); assertEquals(-999999L, stats[1]); assertFalse(iter.nextGroup()); assertFalse(iter.nextTerm()); assertFalse(iter.nextField()); } @Test public void testEmptyField() throws IOException { final ByteArrayOutputStream out = new ByteArrayOutputStream(); final FTGSOutputStreamWriter w = new FTGSOutputStreamWriter(out); w.switchField("a", true); w.switchField("b", true); w.switchField("c", true); w.switchField("d", false); w.close(); final InputStreamFTGSIterator iter = new InputStreamFTGSIterator(new ByteArrayInputStream(out.toByteArray()), 0); assertTrue(iter.nextField()); assertTrue(iter.fieldIsIntType()); assertEquals("a", iter.fieldName()); assertFalse(iter.nextTerm()); assertTrue(iter.nextField()); assertTrue(iter.fieldIsIntType()); assertEquals("b", iter.fieldName()); assertFalse(iter.nextTerm()); assertTrue(iter.nextField()); assertTrue(iter.fieldIsIntType()); assertEquals("c", iter.fieldName()); assertFalse(iter.nextTerm()); assertTrue(iter.nextField()); assertFalse(iter.fieldIsIntType()); assertEquals("d", iter.fieldName()); assertFalse(iter.nextTerm()); assertFalse(iter.nextField()); } @Test public void testIt() throws IOException { final ByteArrayOutputStream out = new ByteArrayOutputStream(); { final FTGSOutputStreamWriter writer = new FTGSOutputStreamWriter(out); writer.switchField("abc", true); writer.switchIntTerm(0, 5); writer.switchGroup(0); writer.addStat(12345); writer.addStat(0); writer.switchGroup(1); writer.addStat(2); writer.addStat(3); writer.switchGroup(4); writer.addStat(4); writer.addStat(5); writer.switchIntTerm(1, 4); writer.switchGroup(3); writer.addStat(6); writer.addStat(123456789012345l); writer.switchIntTerm(3, 3); writer.switchGroup(5); writer.addStat(3); writer.addStat(4); writer.switchIntTerm(100, 0); // this term shouldn't really get written writer.switchField("xyz", false); writer.switchBytesTerm("".getBytes(), "".getBytes().length, 3); writer.switchGroup(0); writer.addStat(123); writer.addStat(456); writer.switchBytesTerm("foobar".getBytes(), "foobar".getBytes().length, 2); writer.switchGroup(0); writer.addStat(999); writer.addStat(1000); writer.switchGroup(3); writer.addStat(1001); writer.addStat(1002); writer.switchBytesTerm("foobar2".getBytes(), "foobar2".getBytes().length, 1); writer.switchGroup(100); writer.addStat(999); writer.addStat(997); writer.switchGroup(300); writer.addStat(995); writer.addStat(993); writer.switchBytesTerm("foobaz".getBytes(), "foobaz".getBytes().length, 6); writer.switchGroup(100); writer.addStat(999); writer.addStat(997); writer.switchGroup(300); writer.addStat(995); writer.addStat(993); writer.close(); } { final long[] stats = new long[2]; final InputStreamFTGSIterator input = new InputStreamFTGSIterator(new ByteArrayInputStream(out.toByteArray()), 2); assertTrue(input.nextField()); assertEquals("abc", input.fieldName()); assertEquals(true, input.fieldIsIntType()); assertTrue(input.nextTerm()); assertEquals(0, input.termIntVal()); assertEquals(5, input.termDocFreq()); assertTrue(input.nextGroup()); assertEquals(0, input.group()); input.groupStats(stats); assertEquals(12345, stats[0]); assertEquals(0, stats[1]); assertTrue(input.nextGroup()); assertEquals(1, input.group()); input.groupStats(stats); assertEquals(2, stats[0]); assertEquals(3, stats[1]); assertTrue(input.nextGroup()); assertEquals(4, input.group()); input.groupStats(stats); assertEquals(4, stats[0]); assertEquals(5, stats[1]); assertFalse(input.nextGroup()); assertTrue(input.nextTerm()); assertEquals(1, input.termIntVal()); assertEquals(4, input.termDocFreq()); assertTrue(input.nextGroup()); assertEquals(3, input.group()); input.groupStats(stats); assertEquals(6, stats[0]); assertEquals(123456789012345l, stats[1]); assertFalse(input.nextGroup()); assertTrue(input.nextTerm()); assertEquals(3, input.termIntVal()); assertEquals(3, input.termDocFreq()); assertTrue(input.nextGroup()); assertEquals(5, input.group()); input.groupStats(stats); assertEquals(3, stats[0]); assertEquals(4, stats[1]); assertFalse(input.nextGroup()); assertFalse(input.nextTerm()); assertTrue(input.nextField()); assertEquals("xyz", input.fieldName()); assertEquals(false, input.fieldIsIntType()); assertTrue(input.nextTerm()); assertEquals("", input.termStringVal()); assertEquals(3, input.termDocFreq()); assertTrue(input.nextGroup()); assertEquals(0, input.group()); input.groupStats(stats); assertEquals(123, stats[0]); assertEquals(456, stats[1]); assertFalse(input.nextGroup()); assertTrue(input.nextTerm()); assertEquals("foobar", input.termStringVal()); assertEquals(2, input.termDocFreq()); assertTrue(input.nextGroup()); assertEquals(0, input.group()); input.groupStats(stats); assertEquals(999, stats[0]); assertEquals(1000, stats[1]); assertTrue(input.nextGroup()); assertEquals(3, input.group()); input.groupStats(stats); assertEquals(1001, stats[0]); assertEquals(1002, stats[1]); assertFalse(input.nextGroup()); assertTrue(input.nextTerm()); assertEquals("foobar2", input.termStringVal()); assertEquals(1, input.termDocFreq()); assertTrue(input.nextGroup()); assertEquals(100, input.group()); input.groupStats(stats); assertEquals(999, stats[0]); assertEquals(997, stats[1]); assertTrue(input.nextGroup()); assertEquals(300, input.group()); input.groupStats(stats); assertEquals(995, stats[0]); assertEquals(993, stats[1]); assertFalse(input.nextGroup()); assertTrue(input.nextTerm()); assertEquals("foobaz", input.termStringVal()); assertEquals(6, input.termDocFreq()); assertTrue(input.nextGroup()); assertEquals(100, input.group()); input.groupStats(stats); assertEquals(999, stats[0]); assertEquals(997, stats[1]); assertTrue(input.nextGroup()); assertEquals(300, input.group()); input.groupStats(stats); assertEquals(995, stats[0]); assertEquals(993, stats[1]); assertFalse(input.nextGroup()); assertFalse(input.nextTerm()); assertFalse(input.nextField()); } { final InputStreamFTGSIterator input = new InputStreamFTGSIterator(new ByteArrayInputStream(out.toByteArray()), 2); assertTrue(input.nextField()); assertEquals("abc", input.fieldName()); assertEquals(true, input.fieldIsIntType()); assertTrue(input.nextField()); assertEquals("xyz", input.fieldName()); assertEquals(false, input.fieldIsIntType()); assertFalse(input.nextField()); } } }