/* * Copyright 2004-2009 the original author or authors. * * 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 org.compass.core.test.find; import java.util.Iterator; import java.util.NoSuchElementException; import org.apache.lucene.search.Explanation; import org.compass.core.CompassDetachedHits; import org.compass.core.CompassHit; import org.compass.core.CompassHits; import org.compass.core.CompassSession; import org.compass.core.CompassTransaction; import org.compass.core.Resource; import org.compass.core.lucene.util.LuceneHelper; import org.compass.core.test.AbstractTestCase; /** * @author kimchy */ public class FindTests extends AbstractTestCase { protected String[] getMappings() { return new String[]{"find/find.cpm.xml"}; } public void testIterator() { CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); Long id1 = new Long(1); A a1 = new A(); a1.setId(id1); a1.setValue("value 1"); session.save(a1); Long id2 = new Long(2); A a2 = new A(); a2.setId(id2); a2.setValue("value 2"); session.save(a2); Iterator<CompassHit> it = session.find("mvalue:\"value 1\"").detach().iterator(); assertEquals(id1, ((A) it.next().getData()).getId()); try { it.next(); fail(); } catch (NoSuchElementException e) { } for (CompassHit hit : session.find("mvalue:\"value 1\"")) { assertEquals(id1, ((A) hit.getData()).getId()); } tr.commit(); session.close(); } public void testDetach() { addDataA(0, 50); CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); CompassHits hits = session.find("alias:a1"); assertEquals(50, hits.getLength()); CompassDetachedHits detachedHits = hits.detach(40, 10); tr.commit(); session.close(); assertEquals(10, detachedHits.getLength()); assertEquals(50, detachedHits.totalLength()); Resource[] resources = detachedHits.getResources(); assertEquals(10, resources.length); Object[] datas = detachedHits.getDatas(); assertEquals(10, datas.length); } public void testWithAsterix() { addDataA(0, 10); addDataB(0, 10); CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); addDataA(10, 20); addDataB(10, 20); CompassHits hits = session.find("v*"); assertEquals(40, hits.getLength()); tr.commit(); session.close(); } public void testWithMinus() { addDataA(0, 10); CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); CompassHits hits = session.find("+value* -value1"); assertEquals(9, hits.length()); tr.commit(); session.close(); } public void testWithPrefix() { CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); A a = new A(); a.setId(new Long(1)); a.setValue("20020101"); session.save(a); CompassHits hits = session.find("mvalue:20020101"); assertEquals(1, hits.getLength()); tr.commit(); session.close(); } public void testSubIndexAliasNarrow() { addDataA(0, 10); addDataB(0, 10); CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); CompassHits hits = session.find("alias:a1 OR alias:b1"); assertEquals(20, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setAliases("a1").hits(); assertEquals(10, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setAliases("a1", "a1").hits(); assertEquals(10, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setSubIndexes("a1").hits(); assertEquals(10, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setSubIndexes("a1", "a1").hits(); assertEquals(10, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setSubIndexes("a1") .setAliases("a1").hits(); assertEquals(10, hits.getLength()); tr.commit(); session.close(); } public void testSubIndexTypeNarrow() { addDataA(0, 10); addDataB(0, 10); CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); CompassHits hits = session.find("alias:a1 OR alias:b1"); assertEquals(20, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setTypes(A.class).hits(); assertEquals(10, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setSubIndexes("a1").hits(); assertEquals(10, hits.getLength()); hits = session.queryBuilder().queryString("alias:a1 OR alias:b1").toQuery() .setSubIndexes("a1") .setTypes(A.class).hits(); assertEquals(10, hits.getLength()); tr.commit(); session.close(); } public void testLuceneExplanation() { addDataA(0, 10); CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); CompassHits hits = session.find("alias:a1 OR alias:b1"); assertEquals(10, hits.getLength()); Explanation explanation = LuceneHelper.getLuceneSearchEngineHits(hits).explain(0); assertNotNull(explanation); assertEquals("product of:", explanation.getDescription()); tr.commit(); session.close(); } private void addDataA(int from, int to) { CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); for (int i = from; i < to; i++) { A a = new A(); a.setId(new Long(i)); a.setValue("value" + i); session.save(a); } tr.commit(); session.close(); } private void addDataB(int from, int to) { CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); for (int i = from; i < to; i++) { B b = new B(); b.setId(new Long(i)); b.setValue("value" + i); session.save(b); } tr.commit(); session.close(); } }