/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index;
import java.util.Collection;
import java.util.Date;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.joda.time.DateTime;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.content.category.CategoryAccessType;
import com.enonic.cms.core.search.ContentIndexServiceImpl;
import com.enonic.cms.core.search.query.AbstractQuery;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.menuitem.MenuItemKey;
/**
* This class implements the content query.
*/
public final class ContentIndexQuery
extends AbstractQuery
{
// Set the default count to the threshold value for optimizing the count to be shure to get all content
public static final int DEFAULT_COUNT = ContentIndexServiceImpl.COUNT_OPTIMIZER_THRESHOULD_VALUE;
private String facets;
public enum SectionFilterStatus
{
ANY,
APPROVED_ONLY,
UNAPPROVED_ONLY
}
public enum CategoryAccessTypeFilterPolicy
{
AND,
OR
}
private SectionFilterStatus sectionFilterStatus;
private CategoryAccessTypeFilterPolicy categoryAccessTypeFilterPolicy;
private final String query;
/**
* Content key filter.
*/
private Collection<ContentKey> contentFilter;
/**
* Section key filter
*/
private Collection<MenuItemEntity> sectionFilter;
// private boolean approvedSectionContentOnly = true;
// private boolean unapprovedSectionContentOnly = false;
private int index = 0;
private int count = DEFAULT_COUNT;
private boolean returnAllHits = false;
private Integer contentStatusFilter;
private DateTime contentOnlineAtFilter;
private Collection<CategoryAccessType> categoryAccessTypeFilter;
private MenuItemKey orderBySection;
/**
* Construct the query.
*
* @param queryWithoutOrderBy A user defined query, similar to the WHERE part of an SQL query.
* @param orderBy A user defined order by cluase, similar to the ORDER BY part of an SQL query.
* @throws IllegalQueryException If the query can not be parsed.
*/
public ContentIndexQuery( String queryWithoutOrderBy, String orderBy )
{
if ( queryWithoutOrderBy == null )
{
queryWithoutOrderBy = "";
}
if ( ( orderBy != null ) && ( orderBy.length() > 0 ) )
{
queryWithoutOrderBy = queryWithoutOrderBy + " ORDER BY " + orderBy;
}
this.query = queryWithoutOrderBy.trim();
}
public ContentIndexQuery( String query )
{
this.query = query;
}
/**
* Return the query.
*
* @return The query supplied query.
*/
public String getQuery()
{
return this.query;
}
public int getIndex()
{
return this.index;
}
public void setIndex( int index )
{
this.index = index;
}
public int getCount()
{
return this.count;
}
public void setCount( int count )
{
this.count = count;
}
public Collection<ContentKey> getContentFilter()
{
return contentFilter;
}
public void setContentFilter( Collection<ContentKey> filter )
{
contentFilter = filter;
}
public boolean hasSectionFilter()
{
return sectionFilter != null && !sectionFilter.isEmpty();
}
public Collection<MenuItemEntity> getSectionFilter()
{
return sectionFilter;
}
public boolean isSectionFilter()
{
// return sectionFilter != null && sectionFilter.size() > 0;
return ( sectionFilterStatus != null );
}
public void setSectionFilter( Collection<MenuItemEntity> filter, final SectionFilterStatus filterStatus )
{
this.sectionFilter = filter;
this.sectionFilterStatus = filterStatus;
// if ( approvedSectionContentOnly == true && unapprovedSectionContentOnly == true )
// {
// throw new IllegalArgumentException (
// "Illegal section filter. approvedSectionContentOnly and unapprovedSectionContentOnly cannot both be true" );
// }
//
// this.approvedSectionContentOnly = approvedSectionContentOnly;
// this.unapprovedSectionContentOnly = unapprovedSectionContentOnly;
}
public boolean isApprovedSectionContentOnly()
{
if ( sectionFilterStatus == SectionFilterStatus.APPROVED_ONLY )
{
return true;
}
return false;
}
public boolean isUnapprovedSectionContentOnly()
{
if ( sectionFilterStatus == SectionFilterStatus.UNAPPROVED_ONLY )
{
return true;
}
return false;
}
public boolean hasContentStatusFilter()
{
return this.contentStatusFilter != null;
}
public void setContentStatusFilter( Integer contentStatus )
{
this.contentStatusFilter = contentStatus;
}
public Integer getContentStatusFilter()
{
return this.contentStatusFilter;
}
public DateTime getContentOnlineAtFilter()
{
return contentOnlineAtFilter;
}
public void setContentOnlineAtFilter( Date value )
{
this.contentOnlineAtFilter = new DateTime( value );
}
public Collection<CategoryAccessType> getCategoryAccessTypeFilter()
{
return categoryAccessTypeFilter;
}
public void setCategoryAccessTypeFilter( Collection<CategoryAccessType> value, CategoryAccessTypeFilterPolicy policy )
{
if ( value != null && policy == null )
{
throw new IllegalArgumentException( "categoryAccessTypeFilter requries a valid policy, and cannot be NULL " );
}
this.categoryAccessTypeFilter = value;
this.categoryAccessTypeFilterPolicy = policy;
}
@Override
public String toString()
{
ToStringBuilder s = new ToStringBuilder( this, ToStringStyle.MULTI_LINE_STYLE );
s.append( "index", index );
s.append( "count", count );
s.append( "query", query );
s.append( "categoryAccessTypeFilter", categoryAccessTypeFilter );
s.append( "approvedSectionContentOnly", sectionFilterStatus );
s.append( "contentStatusFilter", contentStatusFilter );
s.append( "contentOnlineAtFilter", contentOnlineAtFilter );
s.append( "contentFilter", contentFilter );
s.append( "sectionFilter", sectionFilter );
s.append( "categoryFilter", getCategoryFilter() );
s.append( "contentTypeFilter", getContentTypeFilter() );
s.append( "securityFilter", getSecurityFilter() );
s.append( "orderBySection", orderBySection );
s.append( "facetDefinition", facets );
return s.toString();
}
public CategoryAccessTypeFilterPolicy getCategoryAccessTypeFilterPolicy()
{
return categoryAccessTypeFilterPolicy;
}
public MenuItemKey getOrderBySection()
{
return orderBySection;
}
public void setOrderBySection( MenuItemKey orderBySection )
{
this.orderBySection = orderBySection;
}
public String getFacets()
{
return facets;
}
public void setFacets( final String facets )
{
this.facets = facets;
}
public boolean doReturnAllHits()
{
return returnAllHits;
}
public void setReturnAllHits( final boolean returnAllHits )
{
this.returnAllHits = returnAllHits;
}
}