/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.plugin;
import java.io.Serializable;
/**
* Entry point for the extension API for aggregation multi-functions.
* <p>
* This API allows adding one or more related aggregation functions that can share state,
* share parameters or exhibit related behavior.
* </p>
* <p>
* Please use {@link com.espertech.esper.client.ConfigurationPlugInAggregationMultiFunction}
* to register this factory class in the engine together with one or more function names.
* </p>
* <p>
* The engine instantiates a single instance of this class at the time it encounters the first
* aggregation multi-function in a given statement at the time of statement parsing or
* compilation from statement object model.
* </p>
* <p>
* At the time of statement parsing, each aggregation multi-function encountered during parsing
* of EPL statement text results in an invocation to {@link #addAggregationFunction(PlugInAggregationMultiFunctionDeclarationContext)}. The same
* upon statement compilation for statement object model.
* For multiple aggregation functions, the order in which such calls occur is not well defined
* and should not be relied on by the implementation.
* </p>
* <p>
* The engine invokes {@link #validateGetHandler(PlugInAggregationMultiFunctionValidationContext)}
* at the time of expression node validation. Validation occurs after statement parsing
* and when type information is established.
* For multiple aggregation functions, the order in which such calls occur is not well defined
* and should not be relied on by the implementation.
* </p>
* <p>
* Usually a single {@link PlugInAggregationMultiFunctionHandler} handler class can handle the needs
* of all related aggregation functions.
* Usually you have a single handler class and return one handler object for each
* aggregation function expression, where the handler object takes the validation context as a parameter.
* Use multiple different handler classes when your aggregation
* functions have sufficiently different execution contexts or behaviors. Your application may want to use the
* expression and type information available in
* {@link PlugInAggregationMultiFunctionValidationContext} to decide what behavior to provide.
* </p>
* <p>
* The function class must be Serializable only when used with EsperHA.
* </p>
*/
public interface PlugInAggregationMultiFunctionFactory extends Serializable {
/**
* Called for each instance of use of any of the aggregation functions at declaration discovery time
* and before any expression validation takes place.
*
* @param declarationContext context
*/
public void addAggregationFunction(PlugInAggregationMultiFunctionDeclarationContext declarationContext);
/**
* Called for each instance of use of any of the aggregation functions at validation time
* after all declared aggregation have been added.
*
* @param validationContext validationContext
* @return handler for providing type information, accessor and provider factory
*/
public PlugInAggregationMultiFunctionHandler validateGetHandler(PlugInAggregationMultiFunctionValidationContext validationContext);
}