/* * 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'" ) ); } }