/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index.queryexpression;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import com.enonic.cms.core.content.index.optimizer.LogicalOrOptimizer;
import static org.junit.Assert.*;
public class QueryParserTest
{
private QueryExpr parseQuery( String query )
{
return new QueryParser().parse( query );
}
private String parseQueryToString( String query )
{
return parseQuery( query ).toString();
}
@Test
public void testCharsInField()
{
QueryExpr test = parseQuery( "@a.b.c/d.e.f/g-h-i/j_k_l/* = -2.1" );
assertEquals( "@a.b.c/d.e.f/g-h-i/j_k_l/* = -2.1", test.toString() );
test = parseQuery( "*/b/c/d/* = -2" );
assertEquals( "*/b/c/d/* = -2", test.toString() );
test = parseQuery( "* = -2" );
assertEquals( "* = -2", test.toString() );
}
@Test
public void testCombinedLogicalOr()
{
QueryExpr test = parseQuery( "a = 1 or b = 2 or c = 3" );
LogicalOrOptimizer logicalOrOptimizer = new LogicalOrOptimizer();
Expression optExpr = logicalOrOptimizer.optimize( test.getExpr() );
assertEquals( "or[a = 1, b = 2, c = 3]", optExpr.toString() );
}
@Test
public void testCombinedLogicalOrWithMetaFields()
{
QueryExpr test = parseQuery( "status = 2 or publishfrom > 'mydate' or key = 3398" );
LogicalOrOptimizer logicalOrOptimizer = new LogicalOrOptimizer();
Expression optExpr = logicalOrOptimizer.optimize( test.getExpr() );
assertEquals( "or[status = 2, publishfrom > 'mydate', key = 3398]", optExpr.toString() );
}
@Test
public void testCombinedLogicalOrWithAndClause()
{
QueryExpr test = parseQuery( "a = 1 and (b = 2 or c = 3)" );
LogicalOrOptimizer logicalOrOptimizer = new LogicalOrOptimizer();
Expression optExpr = logicalOrOptimizer.optimize( test.getExpr() );
assertEquals( "(a = 1 AND or[b = 2, c = 3])", optExpr.toString() );
}
@Test
public void testLikeOperator()
{
QueryExpr test = parseQuery( "a like 'abc'" );
assertTrue( StringUtils.containsIgnoreCase( test.getExpr().toString(), "like" ) );
}
@Test
public void testFulltextOperator()
{
QueryExpr test = parseQuery( "a FT 'abc'" );
assertTrue( StringUtils.containsIgnoreCase( test.getExpr().toString(), "FT" ) );
}
@Test
public void testAtAfterSlash()
{
QueryExpr test = parseQuery( "data/topkey/@key = 1 or @key = 1" );
}
@Test
public void testFields()
{
assertEquals( "a = 1", parseQueryToString( "a = 1" ) );
assertEquals( "a/b = 1", parseQueryToString( "a/b = 1" ) );
assertEquals( "a.b = 1", parseQueryToString( "a.b = 1" ) );
}
@Test
public void testNumberValue()
{
assertEquals( "a = 4", parseQueryToString( "a = 4" ) );
assertEquals( "a = 8", parseQueryToString( "a = 8" ) );
}
@Test
public void testStringValue()
{
assertEquals( "a = ''", parseQueryToString( "a = ''" ) );
assertEquals( "a = 'value'", parseQueryToString( "a = 'value'" ) );
}
}