All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.bop.aggregate.AggregateBase Maven / Gradle / Ivy

package com.bigdata.bop.aggregate;

import java.util.Map;

import org.openrdf.model.Literal;
import org.openrdf.model.impl.LiteralImpl;

import com.bigdata.bop.BOp;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IValueExpression;
import com.bigdata.bop.ImmutableBOp;
import com.bigdata.bop.NV;
import com.bigdata.bop.Var;
import com.bigdata.rdf.internal.impl.literal.NumericIV;
import com.bigdata.rdf.internal.impl.literal.XSDNumericIV;
import com.bigdata.rdf.model.BigdataLiteral;

/**
 * Abstract base class for aggregate functions.
 * 
 * @author thompsonbry
 *
 * @param 
 */
abstract public class AggregateBase extends ImmutableBOp implements IAggregate {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
//	/**
//	 * A type safe enumeration of well known aggregate functions.
//	 */
//	static public enum FunctionCode {
//
//		/**
//		 * The count of the #of computed value expressions within the solution
//		 * group. In combination with the special keyword DISTINCT, this is the
//		 * #of distinct values from the computed value expression within the
//		 * solution group. When given with the special variable *,
//		 * this is the count of the #of solutions (or distinct solutions if also
//		 * combined with DISTINCT) within the group.
//		 */
//		COUNT(0),
//
//		/**
//		 * The sum of the computed value expressions within the solution group.
//		 * In combination with the special keyword DISTINCT, this is the sum of
//		 * the distinct values from the computed value expressions within the
//		 * solution group.
//		 */
//		SUM(1),
//
//		/**
//		 * The average is defined as
//		 * AVG(expr) := SUM(expr)/COUNT(expr). Note that both SUM
//		 * and COUNT can be hash partitioned over a cluster, so it often makes
//		 * sense to rewrite AVG(expr) internally in terms of COUNT and SUM. This
//		 * may be combined with DISTINCT.
//		 */
//		AVG(2),
//
//		/**
//		 * MIN(expr) is the minimum observed value for the computed value
//		 * expressions according to the ordering semantics of
//		 * ORDER BY expr ASC. This may be combined with DISTINCT.
//		 */
//		MIN(3), 
//		
//		/**
//		 * MAX(expr) is the maximum observed value for the computed value
//		 * expressions according to the ordering semantics of
//		 * ORDER BY expr ASC. This may be combined with DISTINCT.
//		 */
//		MAX(4),
//		
//		/**
//		 * The combined values of the computed value expressions as a string.
//		 * This may be combined with DISTINCT. 
//		 */
//		GROUP_CONCAT(5),
//
//		/**
//		 * This evaluates to an arbitrary value of the computed value
//		 * expressions. This may be combined with DISTINCT to sample from the
//		 * distinct computed values. While the implementation is not required to
//		 * choose randomly among the values to be sampled, random sampling may
//		 * prove more useful to some applications.
//		 */
//		SAMPLE(6);
//		
//		private FunctionCode(int code) {
//			this.code = code;
//		}
//
//		final private int code;
//
//		public int getCode() {
//			return code;
//		}
//		
//	}
	
	public interface Annotations extends ImmutableBOp.Annotations {

//        /**
//         * The aggregate function identifier ({@link FunctionCode#COUNT},
//         * {@link FunctionCode#SUM}, etc).
//         */
//        String FUNCTION_CODE = AggregateBase.class.getName() + ".functionCode";

        /**
         * Optional boolean property indicates whether the aggregate applies to
         * the distinct within group solutions (default
         * {@value #DEFAULT_DISTINCT}).
         */
        String DISTINCT = AggregateBase.class.getName() + ".distinct";

		boolean DEFAULT_DISTINCT = false;
		
	}

	public AggregateBase(AggregateBase op) {
		super(op);
	}

	/**
	 * Core shallow copy constructor. The distinct option is modeled
	 * using {@link Annotations#DISTINCT}. The expr is modeled as the
	 * first argument for the aggregate function.
	 * 
	 * @param args
	 * @param annotations
	 */
	public AggregateBase(BOp[] args, Map annotations) {

		super(args, annotations);

	}

	/**
	 * @param distinct
	 *            true iff the keyword DISTINCT was used, for
	 *            example COUNT(DISTINCT y)
	 * @param expr
	 *            The value expression to be computed, for example
	 *            x in COUNT(DISTINCT x) or
	 *            y+x in MIN(x+y). Note that only
	 *            COUNT may be used with the special variable *.
	 */
//    * @param functionCode
//    *            The type safe value identifying the desired aggregate
//    *            function.
	public AggregateBase(//final FunctionCode functionCode,
			final boolean distinct, final IValueExpression...expr) {

		this(expr, NV.asMap(//
//				new NV(Annotations.FUNCTION_CODE, functionCode), //
				new NV(Annotations.DISTINCT, distinct))//
		);

	}

	final public boolean isDistinct() {

		return getProperty(Annotations.DISTINCT, Annotations.DEFAULT_DISTINCT);

	}

    public boolean isWildcard() {

        return get(0).equals(Var.var("*"));

    }

    /**
     * {@inheritDoc}
     * 

* Operation is not implemented by this class and must be overridden if the * {@link AggregateBase} is to be directly evaluated. However, note that the * computation of aggregate functions is often based on hard coded * recognition of the appropriate function code. *

* Note: DISTINCT is merely carried as a marker on COUNT (and the other * aggregate functions). The application of DISTINCT to the inner expression * to form a column projection is handled by the driving evaluation logic * rather than by {@link #get(IBindingSet)}. */ public E get(IBindingSet bset) { throw new UnsupportedOperationException(); } /** A ZERO. */ protected static final transient NumericIV ZERO = new XSDNumericIV(0); /** An empty string. */ protected static final transient Literal EMPTY_LITERAL = new LiteralImpl(""); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy