/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.search;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
import org.junit.Ignore;
import org.junit.Test;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.content.category.CategoryKey;
import com.enonic.cms.core.content.contenttype.ContentTypeKey;
import com.enonic.cms.core.content.index.ContentIndexQuery;
import com.enonic.cms.core.content.resultset.ContentResultSet;
import com.enonic.cms.core.search.query.ContentDocument;
import com.enonic.cms.core.search.query.SimpleText;
import static org.junit.Assert.*;
public class ContentIndexServiceImpl_queryDatesTest
extends ContentIndexServiceTestBase
{
@Test
public void testDateQueries()
{
setUpStandardTestValues();
ContentIndexQuery query1 = new ContentIndexQuery( "publishFrom = date('2008-02-28 00:00:00')" );
ContentResultSet res1 = contentIndexService.query( query1 );
assertEquals( 1, res1.getLength() );
ContentIndexQuery query2 = new ContentIndexQuery( "publishFrom = date('2008-02-28T00:00:00')" );
ContentResultSet res2 = contentIndexService.query( query2 );
assertEquals( 1, res2.getLength() );
ContentIndexQuery query3 = new ContentIndexQuery( "publishFrom <= date('2008-02-29T00:00:00')" );
ContentResultSet res3 = contentIndexService.query( query3 );
assertEquals( 2, res3.getLength() );
ContentIndexQuery query4 = new ContentIndexQuery( "publishFrom > date('2008-02-28')" );
ContentResultSet res4 = contentIndexService.query( query4 );
assertEquals( 3, res4.getLength() );
ContentIndexQuery query5 =
new ContentIndexQuery( "publishFrom >= date('2008-02-29T00:00:00') AND publishTo < date('2008-03-29T00:00:00')" );
ContentResultSet res5 = contentIndexService.query( query5 );
assertEquals( 1, res5.getLength() );
}
@Test
public void testBirthDateWithTime()
{
final GregorianCalendar date = new GregorianCalendar( 2008, Calendar.FEBRUARY, 28 );
ContentDocument doc1 = new ContentDocument( new ContentKey( 1322 ) );
doc1.setCategoryKey( new CategoryKey( 9 ) );
doc1.setContentTypeKey( new ContentTypeKey( 32 ) );
doc1.setContentTypeName( "Adults" );
doc1.setTitle( "Homer" );
doc1.addUserDefinedField( "data/person/age", new SimpleText( "38" ) );
doc1.addUserDefinedField( "data/person/gender", "male" );
doc1.addUserDefinedField( "data/person/description", "description1-1" );
doc1.addUserDefinedField( "data/person/birthdate", new SimpleText( "1975-05-05" ) );
// Publish from February 28th to March 28th.
doc1.setPublishFrom( date.getTime() );
date.add( Calendar.MONTH, 1 );
doc1.setPublishTo( date.getTime() );
date.add( Calendar.MONTH, -1 );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
doc1.setLanguageCode( "en" );
contentIndexService.index( doc1 );
flushIndex();
ContentIndexQuery query1 = new ContentIndexQuery( "data/person/birthdate = date('1975-05-05')" );
ContentResultSet res1 = contentIndexService.query( query1 );
assertEquals( 1, res1.getLength() );
doc1.addUserDefinedField( "data/person/birthdate2", new SimpleText( "1975-05-05 01:00" ) );
contentIndexService.index( doc1 );
flushIndex();
query1 = new ContentIndexQuery( "data/person/birthdate2 = date('1975-05-05')" );
res1 = contentIndexService.query( query1 );
assertEquals( 1, res1.getLength() );
}
@Test
public void testQueryReturnsEmptyResultWhenNowIsOneMillisecondBeforePublishFrom()
{
ContentDocument doc1 = new ContentDocument( new ContentKey( 3001 ) );
doc1.setCategoryKey( new CategoryKey( 201 ) );
doc1.setContentTypeKey( new ContentTypeKey( 101 ) );
doc1.setContentTypeName( "Person" );
doc1.setTitle( "Jørund Vier Skriubakken" );
doc1.setPublishFrom( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
contentIndexService.index( doc1 );
//flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "@key = 3001" );
query.setContentOnlineAtFilter( new DateTime( 2010, 4, 19, 13, 0, 59, 999 ).toDate() );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 0, contentResultSet.getKeys().size() );
}
@Test
public void testQueryReturnsAResultWhenNowIsSameAsPublishFrom()
{
ContentDocument doc1 = new ContentDocument( new ContentKey( 3001 ) );
doc1.setCategoryKey( new CategoryKey( 201 ) );
doc1.setContentTypeKey( new ContentTypeKey( 101 ) );
doc1.setContentTypeName( "Person" );
doc1.setTitle( "Jørund Vier Skriubakken" );
doc1.setPublishFrom( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
contentIndexService.index( doc1 );
flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "@key = 3001" );
query.setContentOnlineAtFilter( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
}
@Test
public void testQueryReturnsAResultWhenNowIsOneMillisecondAfterPublishFrom()
{
ContentDocument doc1 = new ContentDocument( new ContentKey( 3001 ) );
doc1.setCategoryKey( new CategoryKey( 201 ) );
doc1.setContentTypeKey( new ContentTypeKey( 101 ) );
doc1.setContentTypeName( "Person" );
doc1.setTitle( "Jørund Vier Skriubakken" );
doc1.setPublishFrom( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
contentIndexService.index( doc1 );
flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "@key = 3001" );
query.setContentOnlineAtFilter( new DateTime( 2010, 4, 19, 13, 1, 0, 1 ).toDate() );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
}
@Test
public void testQueryReturnsEmptytWhenNowIsSameAsBothPublishFromAndPublishTo()
{
ContentDocument doc1 = new ContentDocument( new ContentKey( 3001 ) );
doc1.setCategoryKey( new CategoryKey( 201 ) );
doc1.setContentTypeKey( new ContentTypeKey( 101 ) );
doc1.setContentTypeName( "Person" );
doc1.setTitle( "Jørund Vier Skriubakken" );
doc1.setPublishFrom( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setPublishTo( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
contentIndexService.index( doc1 );
//flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "@key = 3001" );
query.setContentOnlineAtFilter( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 0, contentResultSet.getKeys().size() );
}
@Test
public void testQueryReturnsEmptyWhenNowIsAfterPublishFromAndSameAsPublishTo()
{
ContentDocument doc1 = new ContentDocument( new ContentKey( 3001 ) );
doc1.setCategoryKey( new CategoryKey( 201 ) );
doc1.setContentTypeKey( new ContentTypeKey( 101 ) );
doc1.setContentTypeName( "Person" );
doc1.setTitle( "Jørund Vier Skriubakken" );
doc1.setPublishFrom( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setPublishTo( new DateTime( 2010, 4, 19, 13, 2, 0, 0 ).toDate() );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
contentIndexService.index( doc1 );
//flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "@key = 3001" );
query.setContentOnlineAtFilter( new DateTime( 2010, 4, 19, 13, 2, 0, 0 ).toDate() );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 0, contentResultSet.getKeys().size() );
}
@Test
public void testQueryReturnsAResultWhenNowIsAfterPublishFromAndWithinThePublishToMinute()
{
ContentDocument doc1 = new ContentDocument( new ContentKey( 3001 ) );
doc1.setCategoryKey( new CategoryKey( 201 ) );
doc1.setContentTypeKey( new ContentTypeKey( 101 ) );
doc1.setContentTypeName( "Person" );
doc1.setTitle( "J�rund Vier Skriubakken" );
doc1.setPublishFrom( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setPublishTo( new DateTime( 2010, 4, 19, 13, 2, 0, 0 ).toDate() );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
contentIndexService.index( doc1 );
flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "@key = 3001" );
query.setContentOnlineAtFilter( new DateTime( 2010, 4, 19, 13, 1, 59, 999 ).toDate() );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
}
@Test
public void testQueryDateEqualsPublishToFromFields()
{
ContentDocument doc1 = new ContentDocument( new ContentKey( 3001 ) );
doc1.setCategoryKey( new CategoryKey( 201 ) );
doc1.setContentTypeKey( new ContentTypeKey( 101 ) );
doc1.setContentTypeName( "Person" );
doc1.setTitle( "Jørund Vier Skriubakken" );
doc1.setPublishFrom( new DateTime( 2010, 4, 19, 13, 1, 0, 0 ).toDate() );
doc1.setPublishTo( new DateTime( 2010, 4, 19, 13, 2, 0, 0 ).toDate() );
doc1.setStatus( 2 );
doc1.setPriority( 0 );
contentIndexService.index( doc1 );
flushIndex();
ContentIndexQuery query =
new ContentIndexQuery( "@publishFrom = date('2010-04-19 13:01') AND @publishTo = date('2010-04-19 13:02')" );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
ContentIndexQuery queryNotEquals =
new ContentIndexQuery( "@publishFrom != date('2010-04-19 13:01') OR @publishTo != date('2010-04-19 13:02')" );
ContentResultSet contentResultSet2 = contentIndexService.query( queryNotEquals );
assertEquals( 0, contentResultSet2.getKeys().size() );
}
@Test
@Ignore // does not have sence - will work or fail in different timezones. test tests that you are in UTC+2 timezone
public void testQueryDateFieldsInUserData_equals()
{
final ContentDocument contentDocument = createContentDocument( 1 );
addUserDefinedBlock( contentDocument, "1975-05-05" );
contentIndexService.index( contentDocument );
flushIndex();
/*
Enonic Content Query Language supported date-formates:
yyyy-MM-ddTHH:mm:ss
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd HH:mm
yyyy-MM-dd
*/
ContentIndexQuery query = new ContentIndexQuery( "data/person/birthdate = date('1975-05-05')" );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate = date('1975-05-05 00:00')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate = date('1975-05-05 00:00:00')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate = date('1975-05-04T23:00:00.000Z')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
}
@Test
public void testQueryDateFieldsInUserData_range_multiple_entries_in_one_doc()
{
final ContentDocument contentDocument = createContentDocument( 1 );
addUserDefinedBlock( contentDocument, "1975-05-05" );
addUserDefinedBlock( contentDocument, "1994-06-06" );
addUserDefinedBlock( contentDocument, "1975-06-06" );
contentIndexService.index( contentDocument );
flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "data/person/birthdate <= date('1975-05-05')" );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate >= date('1976-06-06 00:00')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate < date('1975-05-05 00:00:00')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 0, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate > date('1994-06-06T23:00:00.000Z')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 0, contentResultSet.getKeys().size() );
}
@Test
public void testQueryDateFieldsInUserData_range_single_entry_in_multiple_docs()
{
final ContentDocument contentDocument1 = createContentDocument( 1 );
addUserDefinedBlock( contentDocument1, "1975-05-05" );
final ContentDocument contentDocument2 = createContentDocument( 2 );
addUserDefinedBlock( contentDocument2, "1994-06-06" );
final ContentDocument contentDocument3 = createContentDocument( 3 );
addUserDefinedBlock( contentDocument3, "1975-06-06" );
contentIndexService.index( contentDocument1 );
contentIndexService.index( contentDocument2 );
contentIndexService.index( contentDocument3 );
flushIndex();
ContentIndexQuery query = new ContentIndexQuery( "data/person/birthdate <= date('1975-05-05')" );
ContentResultSet contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate >= date('1975-05-05 00:00')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 3, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate < date('1994-06-06 00:00:00')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 2, contentResultSet.getKeys().size() );
query = new ContentIndexQuery( "data/person/birthdate > date('1975-06-06T23:00:00.000Z')" );
contentResultSet = contentIndexService.query( query );
assertEquals( 1, contentResultSet.getKeys().size() );
}
private ContentDocument createContentDocument( int contentKey )
{
ContentDocument doc1 = new ContentDocument( new ContentKey( contentKey ) );
doc1.setCategoryKey( new CategoryKey( 9 ) );
doc1.setContentTypeKey( new ContentTypeKey( 32 ) );
doc1.setTitle( "Family" );
doc1.setContentTypeName( "Adults" );
return doc1;
}
private void addUserDefinedBlock( final ContentDocument doc1, String birthdate )
{
doc1.addUserDefinedField( "data/person/birthdate", birthdate );
}
}