/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index.queryexpression;
import java.util.ArrayList;
import java.util.List;
import com.enonic.cms.core.content.contenttype.ContentTypeEntity;
import com.enonic.cms.store.dao.ContentTypeDao;
public class ContentTypeEvaluator
extends QueryEvaluatorAdapter
{
private ContentTypeDao contentTypeDao;
public ContentTypeEvaluator( ContentTypeDao contentTypeDao )
{
this.contentTypeDao = contentTypeDao;
}
public Object evaluate( CompareExpr expr )
{
Expression left = (Expression) expr.getLeft().evaluate( this );
if ( isContentType( left ) )
{
int operator = expr.getOperator();
if ( CompareExpr.EQ == operator || CompareExpr.NEQ == operator )
{
return populateEqual( expr );
}
else if ( CompareExpr.IN == operator || CompareExpr.NOT_IN == operator )
{
return populateIn( expr );
}
}
return expr;
}
private Object populateEqual( CompareExpr expr )
{
Expression right = (Expression) expr.getRight().evaluate( this );
if ( right instanceof ValueExpr )
{
ValueExpr valueExpr = (ValueExpr) right;
if ( valueExpr.isString() )
{
String contentTypeName = (String) valueExpr.getValue();
ContentTypeEntity type = contentTypeDao.findByName( contentTypeName );
if ( type != null )
{
return new CompareExpr( expr.getOperator(), new FieldExpr( "contenttypekey" ),
new ValueExpr( new Integer( type.getKey() ) ) );
}
}
}
return expr;
}
private Object populateIn( CompareExpr expr )
{
Expression right = (Expression) expr.getRight().evaluate( this );
if ( right instanceof ArrayExpr )
{
ArrayExpr arrayExpr = (ArrayExpr) right;
ValueExpr[] values = arrayExpr.getValues();
List<ValueExpr> keyList = new ArrayList<ValueExpr>( values.length );
for ( ValueExpr valueExpr : values )
{
if ( valueExpr.isString() )
{
String contentTypeName = (String) valueExpr.getValue();
ContentTypeEntity type = contentTypeDao.findByName( contentTypeName );
if ( type == null )
{
return expr;
}
keyList.add( new ValueExpr( type.getKey() ) );
}
}
ValueExpr[] keyArray = keyList.toArray( new ValueExpr[keyList.size()] );
return new CompareExpr( expr.getOperator(), new FieldExpr( "contenttypekey" ), new ArrayExpr( keyArray ) );
}
return expr;
}
private boolean isContentType( Expression expr )
{
return ( expr instanceof FieldExpr ) && ( (FieldExpr) expr ).isContentType();
}
}