/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index.optimizer;
import com.enonic.cms.core.content.index.queryexpression.CombinedLogicalOrExpr;
import com.enonic.cms.core.content.index.queryexpression.CompareExpr;
import com.enonic.cms.core.content.index.queryexpression.Expression;
import com.enonic.cms.core.content.index.queryexpression.LogicalExpr;
import com.enonic.cms.core.content.index.queryexpression.NotExpr;
public class LogicalOrOptimizer
{
public Expression optimize( final Expression expression )
{
if ( expression instanceof LogicalExpr )
{
return optimizeLogicalExpr( (LogicalExpr) expression );
}
else if ( expression instanceof NotExpr )
{
return optimizeNotExpr( ( (NotExpr) expression ) );
}
else if ( expression instanceof CompareExpr )
{
return optimizeCompareExpr( ( (CompareExpr) expression ) );
}
return expression;
}
private Expression optimizeCompareExpr( CompareExpr expr )
{
return expr;
}
private Expression optimizeLogicalExpr( LogicalExpr expr )
{
Expression left = optimize( expr.getLeft() );
Expression right = optimize( expr.getRight() );
// does not optimize other than OR expression
if ( expr.getOperator() != LogicalExpr.OR )
{
return new LogicalExpr( expr.getOperator(), left, right );
}
if ( left instanceof CompareExpr && right instanceof CompareExpr )
{
return new CombinedLogicalOrExpr().add( (CompareExpr) left ).add( (CompareExpr) right );
}
if ( left instanceof CompareExpr && right instanceof CombinedLogicalOrExpr )
{
return ( (CombinedLogicalOrExpr) right ).add( (CompareExpr) left );
}
if ( right instanceof CompareExpr && left instanceof CombinedLogicalOrExpr )
{
return ( (CombinedLogicalOrExpr) left ).add( (CompareExpr) right );
}
return new LogicalExpr( expr.getOperator(), left, right );
}
private Expression optimizeNotExpr( NotExpr expr )
{
return optimize( expr.getExpr() );
}
}