/*
NeoDatis ODB : Native Object Database (odb.info@neodatis.org)
Copyright (C) 2007 NeoDatis Inc. http://www.neodatis.org

"This file is part of the NeoDatis ODB open source object database".

NeoDatis ODB is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

NeoDatis ODB is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/
package org.neodatis.odb.impl.core.query.values;

import java.util.Iterator;
import java.util.Map;

import org.neodatis.odb.ODBRuntimeException;
import org.neodatis.odb.OID;
import org.neodatis.odb.core.NeoDatisError;
import org.neodatis.odb.core.query.IValuesQuery;
import org.neodatis.odb.core.query.criteria.ICriterion;
import org.neodatis.odb.core.query.execution.IQueryFieldAction;
import org.neodatis.odb.core.query.values.ICustomQueryFieldAction;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQuery;
import org.neodatis.tool.wrappers.OdbString;
import org.neodatis.tool.wrappers.list.IOdbList;
import org.neodatis.tool.wrappers.list.OdbArrayList;
import org.neodatis.tool.wrappers.map.OdbHashMap;


/**
 * A values Criteria quwry is a query to retrieve object values instead of objects. Values Criteria Query allows one to retrieve one field value of an object:
 * - A field values
 * - The sum of a specific numeric field
 * - The Max value of a specific numeric field
 * - The Min value of a specific numeric field
 * - The Average value of a specific numeric value
 * @author osmadja
 *
 */
public class ValuesCriteriaQuery extends CriteriaQuery implements IValuesQuery{
	
	private IOdbList objectActions;
	private String[] groupByFieldList;
	private boolean hasGroupBy;
	/** To specify if the result must build instance of object meta representation*/
	private boolean returnInstance;
	
	public ValuesCriteriaQuery(Class aClass,OID oid){
        super(aClass.getName());
        setOidOfObjectToQuery(oid);
        init();
    }
	
    public ValuesCriteriaQuery(Class aClass,ICriterion criteria){
        super(aClass.getName(),criteria);
        init();
    }

    public ValuesCriteriaQuery(Class aClass){
    	super(aClass.getName());
    	init();
    }
    public ValuesCriteriaQuery(String aFullClassName){
        super(aFullClassName);
        init();
    }
    public ValuesCriteriaQuery(String aFullClassName,ICriterion criteria){
    	super(aFullClassName,criteria);
    	init();
    	
	}
    public ValuesCriteriaQuery(CriteriaQuery query) {
		this(query.getFullClassName(),query.getCriteria());
		
	}

	private void init(){
    	objectActions = new OdbArrayList();
    	returnInstance = true;
    }

	public IValuesQuery count(String alias) {
		objectActions.add(new CountAction(alias));
		return this;
		
	}

	public IValuesQuery sum(String attributeName) {
		return sum(attributeName,attributeName);
	}
	
	

	public IValuesQuery sum(String attributeName, String alias) {
		objectActions.add(new SumAction(attributeName,alias));
		return this;		
	}
	
	public IValuesQuery sublist(String attributeName, int fromIndex, int size, boolean throwException) {
		return sublist(attributeName,attributeName,fromIndex,size,throwException);
	}
	public IValuesQuery sublist(String attributeName, String alias, int fromIndex, int size, boolean throwException) {
		objectActions.add(new SublistAction(attributeName, alias, fromIndex, size, throwException));
		return this;
	}
	
	public IValuesQuery sublist(String attributeName, int fromIndex, int toIndex) {
		return sublist(attributeName,attributeName,fromIndex,toIndex);
	}
	public IValuesQuery sublist(String attributeName, String alias, int fromIndex, int toIndex) {
		objectActions.add(new SublistAction(attributeName, alias, fromIndex, toIndex));
		return this;
	}
	
	public IValuesQuery size(String attributeName) {
		return size(attributeName,attributeName);
	}
	public IValuesQuery size(String attributeName, String alias) {
		objectActions.add(new SizeAction(attributeName, alias));
		return this;
	}
	
	
	public IValuesQuery avg(String attributeName) {
		return avg(attributeName,attributeName);
	}

	public IValuesQuery avg(String attributeName, String alias) {
		objectActions.add(new AverageValueAction(attributeName,alias));
		return this;		
	}

	public IValuesQuery max(String attributeName) {
		return max(attributeName,attributeName);
	}

	public IValuesQuery max(String attributeName, String alias) {
		objectActions.add(new MaxValueAction(attributeName,alias));
		return this;		
	}

	public IValuesQuery min(String attributeName) {
		return min(attributeName,attributeName);
	}

	public IValuesQuery min(String attributeName, String alias) {
		objectActions.add(new MinValueAction(attributeName,alias));
		return this;		
	}

	public IValuesQuery field(String attributeName){
		return field(attributeName,attributeName);
	}
	public IValuesQuery field(String attributeName, String alias){
		objectActions.add(new FieldValueAction(attributeName,alias));
		return this;
	}
	
	public IValuesQuery custom(String attributeName, ICustomQueryFieldAction action){
		return custom(attributeName, attributeName, action);
	}

	public IValuesQuery custom(String attributeName, String alias, ICustomQueryFieldAction action){
		action.setAttributeName(attributeName);
		action.setAlias(alias);
		objectActions.add(action);
		return this;
	}

	public IOdbList getObjectActions() {
		return objectActions;
	}

	/**
	 * Returns the list of involved fields for this query. List of String
	 * 
	 * 
	 * If query must return sum("value") and field("name"), involvedField will contain "value","name"
	 * 
*/ public IOdbList getAllInvolvedFields() { IOdbList l = new OdbArrayList(); // To check field duplicity Map map = new OdbHashMap(); l.addAll(super.getAllInvolvedFields()); if(!l.isEmpty()){ for(int i=0;i iterator = objectActions.iterator(); IQueryFieldAction oa = null; String name = null; while(iterator.hasNext()){ oa = iterator.next(); if(oa.getClass()!=CountAction.class){ name = oa.getAttributeName(); if(!map.containsKey(name)){ l.add(name); map.put(name,name); } } } if(hasGroupBy){ for(int i=0;i iterator = objectActions.iterator(); if(groupBy){ oneGroupByField = groupByFieldList[0]; while(iterator.hasNext()){ oa = iterator.next(); if(oa instanceof FieldValueAction && oa.getAttributeName().equals(oneGroupByField)){ oa.setMultiRow(false); } } } iterator = objectActions.iterator(); if(iterator.hasNext()){ oa = iterator.next(); isMultiRow = oa.isMultiRow(); } while(iterator.hasNext()){ oa = iterator.next(); if(isMultiRow!=oa.isMultiRow()){ throw new ODBRuntimeException(NeoDatisError.VALUES_QUERY_NOT_CONSISTENT.addParameter(this)); } } return isMultiRow; } public IValuesQuery groupBy(String fieldList) { groupByFieldList = OdbString.split(fieldList,","); hasGroupBy = true; return this; } public boolean hasGroupBy() { return hasGroupBy; } public String[] getGroupByFieldList() { return groupByFieldList; } /* (non-Javadoc) * @see org.neodatis.odb.core.query.IValuesQuery#returnInstance() */ public boolean returnInstance() { return returnInstance; } /* (non-Javadoc) * @see org.neodatis.odb.core.query.IValuesQuery#setReturnInstance(boolean) */ public void setReturnInstance(boolean returnInstance) { this.returnInstance = returnInstance; } }

Ads help maintain this website.