/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.search; import org.apache.commons.lang.StringUtils; import org.junit.Test; import com.enonic.cms.core.content.ContentKey; import com.enonic.cms.core.content.contenttype.ContentTypeKey; import com.enonic.cms.core.content.index.BigText; import com.enonic.cms.core.content.index.ContentIndexQuery; import com.enonic.cms.core.search.query.ContentDocument; /** * Created by IntelliJ IDEA. * User: rmh * Date: 1/3/12 * Time: 1:02 PM */ public class ContentIndexServiceImpl_queryTextTest extends ContentIndexServiceTestBase { @Test public void testOneWordSearchOnTitleAndData() { indexDocument( 123, "ost", "ost", null ); indexDocument( 124, "ost", "kake", null ); indexDocument( 125, "kake", "ost", null ); indexDocument( 126, "kake", "kake", null ); flushIndex(); assertContentResultSetEquals( new int[]{123}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' AND data/* CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{123, 124, 125}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' OR data/* CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{124, 125, 126}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'kake' OR data/* CONTAINS 'kake'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'fisk' OR data/* CONTAINS 'fisk'" ) ) ); } @Test public void testOneWordSearchOnTitleAndFulltext() { indexDocument( 123, "ost", "ost" ); indexDocument( 124, "ost", "kake" ); indexDocument( 125, "kake", "ost" ); indexDocument( 126, "kake", "kake" ); flushIndex(); printAllIndexContent(); assertContentResultSetEquals( new int[]{123}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' AND fulltext CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{123, 124, 125}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' OR fulltext CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{124, 125, 126}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'kake' OR fulltext CONTAINS 'kake'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'fisk' OR fulltext CONTAINS 'fisk'" ) ) ); } private void indexDocument( int contentKey, String title, String fulltext ) { ContentDocument doc1 = new ContentDocument( new ContentKey( contentKey ) ); doc1.setBinaryExtractedText( new BigText( fulltext ) ); doc1.setTitle( title ); doc1.setContentTypeKey( new ContentTypeKey( 1 ) ); doc1.setContentTypeName( "myContentType" ); contentIndexService.index( doc1 ); } private void indexDocument( int contentKey, String title, String userData, String fulltext ) { ContentDocument doc1 = new ContentDocument( new ContentKey( contentKey ) ); if ( StringUtils.isNotBlank( fulltext ) ) { doc1.setBinaryExtractedText( new BigText( fulltext ) ); } doc1.setTitle( title ); doc1.setContentTypeKey( new ContentTypeKey( 1 ) ); doc1.setContentTypeName( "myContentType" ); doc1.addUserDefinedField( "myDataField", userData ); contentIndexService.index( doc1 ); } @Test public void testOneWordSearchOnTitleAndUnknown() { contentIndexService.index( createContentDocument( 123, "ost", null, null ) ); contentIndexService.index( createContentDocument( 124, "kake", null, null ) ); flushIndex(); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' AND unknown CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{123}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' OR unknown CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{124}, contentIndexService.query( new ContentIndexQuery( "unknown CONTAINS 'kake' OR title CONTAINS 'kake'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'fisk' OR unknown CONTAINS 'fisk'" ) ) ); } @Test public void testOneWordSearchOnTitleAndDataAndFulltext() { indexDocument( 121, "ost", "ost", "ost" ); indexDocument( 122, "kake", "ost", "ost" ); indexDocument( 123, "ost", "kake", "ost" ); indexDocument( 124, "ost", "ost", "kake" ); indexDocument( 125, "kake", "kake", "ost" ); indexDocument( 126, "kake", "ost", "kake" ); indexDocument( 127, "ost", "kake", "kake" ); indexDocument( 128, "kake", "kake", "kake" ); flushIndex(); assertContentResultSetEquals( new int[]{121}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' AND data/* CONTAINS 'ost' AND fulltext CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 125, 126, 127}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' OR data/* CONTAINS 'ost' OR fulltext CONTAINS 'ost'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 127}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' OR (data/* CONTAINS 'ost' AND fulltext CONTAINS 'ost')" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 126}, contentIndexService.query( new ContentIndexQuery( "data/* CONTAINS 'ost' OR (title CONTAINS 'ost' AND fulltext CONTAINS 'ost')" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 125}, contentIndexService.query( new ContentIndexQuery( "fulltext CONTAINS 'ost' OR (title CONTAINS 'ost' AND data/* CONTAINS 'ost')" ) ) ); assertContentResultSetEquals( new int[]{121, 123, 124}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' AND (data/* CONTAINS 'ost' OR fulltext CONTAINS 'ost')" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 124}, contentIndexService.query( new ContentIndexQuery( "data/* CONTAINS 'ost' AND (title CONTAINS 'ost' OR fulltext CONTAINS 'ost')" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123}, contentIndexService.query( new ContentIndexQuery( "fulltext CONTAINS 'ost' AND (title CONTAINS 'ost' OR data/* CONTAINS 'ost')" ) ) ); } @Test public void testOneWordSearchOnTitleAndDataAndUnknown() { indexDocument( 123, "ost", "ost", null ); indexDocument( 124, "ost", "kake", null ); indexDocument( 125, "kake", "ost", null ); indexDocument( 126, "kake", "kake", null ); flushIndex(); assertContentResultSetEquals( new int[]{123}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' AND data/* CONTAINS 'ost') OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{123, 124, 125}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' OR data/* CONTAINS 'ost' OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' OR data/* CONTAINS 'ost') AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{124, 125, 126}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'kake' OR data/* CONTAINS 'kake' OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'fisk' OR data/* CONTAINS 'fisk' OR unknown CONTAINS 'fisk'" ) ) ); } @Test public void testOneWordSearchOnTitleAndFulltextAndUnknown() { indexDocument( 123, "ost", "ost" ); indexDocument( 124, "ost", "kake" ); indexDocument( 125, "kake", "ost" ); indexDocument( 126, "kake", "kake" ); flushIndex(); assertContentResultSetEquals( new int[]{123}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' AND fulltext CONTAINS 'ost') OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{123, 124, 125}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' OR fulltext CONTAINS 'ost' OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'ost' AND fulltext CONTAINS 'ost' AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{124, 125, 126}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'kake' OR fulltext CONTAINS 'kake' OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "title CONTAINS 'fisk' OR fulltext CONTAINS 'fisk' OR unknown CONTAINS 'fisk'" ) ) ); } @Test public void testOneWordSearchOnTitleAndDataAndFulltextAndUnknown() { indexDocument( 121, "ost", "ost", "ost" ); indexDocument( 122, "kake", "ost", "ost" ); indexDocument( 123, "ost", "kake", "ost" ); indexDocument( 124, "ost", "ost", "kake" ); indexDocument( 125, "kake", "kake", "ost" ); indexDocument( 126, "kake", "ost", "kake" ); indexDocument( 127, "ost", "kake", "kake" ); indexDocument( 128, "kake", "kake", "kake" ); flushIndex(); assertContentResultSetEquals( new int[]{121}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' AND data/* CONTAINS 'ost' AND fulltext CONTAINS 'ost') OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' AND data/* CONTAINS 'ost' AND fulltext CONTAINS 'ost') AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 125, 126, 127}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' OR data/* CONTAINS 'ost' OR fulltext CONTAINS 'ost') OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' OR data/* CONTAINS 'ost' OR fulltext CONTAINS 'ost') AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 127}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' OR (data/* CONTAINS 'ost' AND fulltext CONTAINS 'ost')) OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' OR (data/* CONTAINS 'ost' AND fulltext CONTAINS 'ost')) AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 126}, contentIndexService.query( new ContentIndexQuery( "(data/* CONTAINS 'ost' OR (title CONTAINS 'ost' AND fulltext CONTAINS 'ost')) OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(data/* CONTAINS 'ost' OR (title CONTAINS 'ost' AND fulltext CONTAINS 'ost')) AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123, 124, 125}, contentIndexService.query( new ContentIndexQuery( "(fulltext CONTAINS 'ost' OR (title CONTAINS 'ost' AND data/* CONTAINS 'ost')) OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(fulltext CONTAINS 'ost' OR (title CONTAINS 'ost' AND data/* CONTAINS 'ost')) AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{121, 123, 124}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' AND (data/* CONTAINS 'ost' OR fulltext CONTAINS 'ost')) OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(title CONTAINS 'ost' AND (data/* CONTAINS 'ost' OR fulltext CONTAINS 'ost')) AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 124}, contentIndexService.query( new ContentIndexQuery( "(data/* CONTAINS 'ost' AND (title CONTAINS 'ost' OR fulltext CONTAINS 'ost')) OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(data/* CONTAINS 'ost' AND (title CONTAINS 'ost' OR fulltext CONTAINS 'ost')) AND unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{121, 122, 123}, contentIndexService.query( new ContentIndexQuery( "(fulltext CONTAINS 'ost' AND (title CONTAINS 'ost' OR data/* CONTAINS 'ost')) OR unknown CONTAINS 'fisk'" ) ) ); assertContentResultSetEquals( new int[]{}, contentIndexService.query( new ContentIndexQuery( "(fulltext CONTAINS 'ost' AND (title CONTAINS 'ost' OR data/* CONTAINS 'ost')) AND unknown CONTAINS 'fisk'" ) ) ); } @Test public void testSplittedNormalIndexWithAnd() { contentIndexService.index( createContentDocument( 101, "title", new String[][]{{"data/text", "fisk ost"}, {"data/text", "torsk tine"}} ) ); contentIndexService.index( createContentDocument( 102, "title", new String[][]{{"data/text", "ku ost"}, {"data/text", "gryte tine"}} ) ); flushIndex(); assertContentResultSetEquals( new int[]{101}, contentIndexService.query( new ContentIndexQuery( "data/text CONTAINS 'fisk' AND data/text CONTAINS 'torsk'", "" ) ) ); } @Test public void testSplittedNormalIndexWithOr() { contentIndexService.index( createContentDocument( 101, "title", new String[][]{{"data/text", "fisk ost"}, {"data/text", "torsk tine"}} ) ); contentIndexService.index( createContentDocument( 102, "title", new String[][]{{"data/text", "ku ost"}, {"data/text", "gryte tine"}} ) ); flushIndex(); assertContentResultSetEquals( new int[]{101}, contentIndexService.query( new ContentIndexQuery( "data/text CONTAINS 'fisk' OR data/text CONTAINS 'torsk'", "" ) ) ); } }