/** * This software is licensed to you under the Apache License, Version 2.0 (the * "Apache License"). * * LinkedIn's contributions are made under the Apache License. If you contribute * to the Software, the contributions will be deemed to have been made under the * Apache License, unless you expressly indicate otherwise. Please do not make any * contributions that would be inconsistent with the Apache License. * * You may obtain a copy of the Apache License at http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, this software * distributed under the Apache License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache * License for the specific language governing permissions and limitations for the * software governed under the Apache License. * * © 2012 LinkedIn Corp. All Rights Reserved. */ package com.senseidb.test; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.Format; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; import junit.framework.TestCase; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.Field.TermVector; import proj.zoie.api.indexing.ZoieIndexable; import proj.zoie.api.indexing.ZoieIndexable.IndexingReq; import com.senseidb.indexing.DefaultSenseiInterpreter; import com.senseidb.indexing.DeleteChecker; import com.senseidb.indexing.Meta; import com.senseidb.indexing.MetaType; import com.senseidb.indexing.SkipChecker; import com.senseidb.indexing.StoredValue; import com.senseidb.indexing.Text; import com.senseidb.indexing.Uid; public class TestIndexingAPI extends TestCase { static class TestObj{ @Uid private long uid; TestObj(long uid){ this.uid = uid; } @Text(name="text") private String content; @Text(store="YES",index="NOT_ANALYZED",termVector="WITH_POSITIONS_OFFSETS") private String content2; @StoredValue(name="store") private String storedVal; @Meta private int age; @Meta(format="yyyyMMdd",type=MetaType.Date) private Date today; @Meta(name="shortie",type=MetaType.String) private short shortVal; @Meta private List<String> tags; @Meta(name="nulls",type=MetaType.Long) private List<Long> nulls; @Meta(name="numbers",type=MetaType.Integer) private Set<Integer> numSet; @DeleteChecker private boolean isDeleted(){ return uid==-1; } @SkipChecker private boolean isSkip(){ return uid==-2; } } private DefaultSenseiInterpreter<TestObj> nodeInterpreter = new DefaultSenseiInterpreter(TestObj.class); public TestIndexingAPI() { } public TestIndexingAPI(String name) { super(name); } public void testDelete(){ TestObj testObj = new TestObj(5); ZoieIndexable indexable = nodeInterpreter.convertAndInterpret(testObj); assertFalse(indexable.isDeleted()); testObj = new TestObj(-1); indexable = nodeInterpreter.convertAndInterpret(testObj); assertTrue(indexable.isDeleted()); } public void testSkip(){ TestObj testObj = new TestObj(-1); ZoieIndexable indexable = nodeInterpreter.convertAndInterpret(testObj); assertFalse(indexable.isSkip()); testObj = new TestObj(-2); indexable = nodeInterpreter.convertAndInterpret(testObj); assertTrue(indexable.isSkip()); } public void testUid(){ long uid = 13; TestObj testObj = new TestObj(uid); ZoieIndexable indexable = nodeInterpreter.convertAndInterpret(testObj); assertEquals(13,indexable.getUID()); } public void testStoredContent(){ TestObj testObj = new TestObj(1); testObj.storedVal = "stored"; ZoieIndexable indexable = nodeInterpreter.convertAndInterpret(testObj); IndexingReq[] reqs = indexable.buildIndexingReqs(); Document doc = reqs[0].getDocument(); Field f = doc.getField("store"); assertEquals("stored",f.stringValue()); assertTrue(f.isStored()); assertFalse(f.isTermVectorStored()); assertFalse(f.isIndexed()); assertFalse(f.isTokenized()); } public void testTextContent(){ TestObj testObj = new TestObj(1); testObj.content = "abc"; testObj.content2 = "def"; ZoieIndexable indexable = nodeInterpreter.convertAndInterpret(testObj); IndexingReq[] reqs = indexable.buildIndexingReqs(); Document doc = reqs[0].getDocument(); Field content1Field = doc.getField("text"); assertNotNull(content1Field); String val = content1Field.stringValue(); assertEquals("abc",val); assertFalse(content1Field.isStored()); assertFalse(content1Field.isTermVectorStored()); assertTrue(content1Field.isIndexed()); assertFalse(content1Field.isTokenized()); Field content2Field = doc.getField("content2"); assertNotNull(content2Field); val = content2Field.stringValue(); assertEquals("def",val); assertTrue(content2Field.isStored()); assertTrue(content2Field.isTermVectorStored()); assertTrue(content2Field.isIndexed()); assertFalse(content2Field.isTokenized()); } private static boolean isMeta(Field f){ return !f.isStored() && f.isIndexed() && !f.isTermVectorStored() && !f.isTokenized(); } public void testMetaContent(){ long now = System.currentTimeMillis(); TestObj testObj = new TestObj(1); testObj.age = 11; testObj.shortVal=3; testObj.today = new Date(now); testObj.tags = new ArrayList<String>(); testObj.tags.add("t1"); testObj.tags.add("t2"); testObj.numSet = new HashSet<Integer>(); testObj.numSet.add(13); testObj.numSet.add(6); testObj.numSet.add(7); testObj.nulls = null; ZoieIndexable indexable = nodeInterpreter.convertAndInterpret(testObj); IndexingReq[] reqs = indexable.buildIndexingReqs(); Document doc = reqs[0].getDocument(); Field ageField = doc.getField("age"); assertNotNull(ageField); assertTrue(isMeta(ageField)); String ageString = ageField.stringValue(); String formatString = DefaultSenseiInterpreter.DEFAULT_FORMAT_STRING_MAP.get(MetaType.Integer); Format formatter = new DecimalFormat(formatString, new DecimalFormatSymbols(Locale.US)); assertEquals(formatter.format(11),ageString); Field shortField = doc.getField("shortie"); assertNotNull(shortField); assertTrue(isMeta(shortField)); String shortString = shortField.stringValue(); assertEquals("3",shortString); Field todayField = doc.getField("today"); assertNotNull(todayField); assertTrue(isMeta(todayField)); String todayString = todayField.stringValue(); formatString = "yyyyMMdd"; formatter = new SimpleDateFormat(formatString); assertEquals(todayString,formatter.format(testObj.today)); Field[] fields = doc.getFields("tags"); assertEquals(2, fields.length); for (Field f : fields){ assertTrue(testObj.tags.contains(f.stringValue())); } fields = doc.getFields("numbers"); assertEquals(3, fields.length); for (Field f : fields){ assertTrue(testObj.numSet.contains(Integer.parseInt(f.stringValue()))); } } public static void main(String[] args) { DefaultSenseiInterpreter<TestObj> nodeInterpreter = new DefaultSenseiInterpreter(TestObj.class); System.out.println(nodeInterpreter); } }