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

com.espertech.esper.view.std.GroupByViewFactory Maven / Gradle / Ivy

/*
 ***************************************************************************************
 *  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.view.std;

import com.espertech.esper.client.EventType;
import com.espertech.esper.client.annotation.Hint;
import com.espertech.esper.client.annotation.HintEnum;
import com.espertech.esper.core.context.util.AgentInstanceContext;
import com.espertech.esper.core.context.util.AgentInstanceViewFactoryChainContext;
import com.espertech.esper.core.service.StatementContext;
import com.espertech.esper.epl.expression.core.ExprNode;
import com.espertech.esper.epl.expression.core.ExprNodeUtility;
import com.espertech.esper.view.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * Factory for {@link GroupByView} instances.
 */
public class GroupByViewFactory implements ViewFactory, GroupByViewFactoryMarker {
    private static Logger log = LoggerFactory.getLogger(GroupByViewFactory.class);

    /**
     * View parameters.
     */
    protected List viewParameters;

    /**
     * List of criteria expressions.
     */
    protected ExprNode[] criteriaExpressions;

    private EventType eventType;

    protected boolean isReclaimAged;
    protected double reclaimMaxAge;
    protected double reclaimFrequency;

    public void setViewParameters(ViewFactoryContext viewFactoryContext, List expressionParameters) throws ViewParameterException {
        this.viewParameters = expressionParameters;

        Hint reclaimGroupAged = HintEnum.RECLAIM_GROUP_AGED.getHint(viewFactoryContext.getStatementContext().getAnnotations());

        if (reclaimGroupAged != null) {
            isReclaimAged = true;
            String hintValueMaxAge = HintEnum.RECLAIM_GROUP_AGED.getHintAssignedValue(reclaimGroupAged);
            if (hintValueMaxAge == null) {
                throw new ViewParameterException("Required hint value for hint '" + HintEnum.RECLAIM_GROUP_AGED + "' has not been provided");
            }
            try {
                reclaimMaxAge = Double.parseDouble(hintValueMaxAge);
            } catch (RuntimeException ex) {
                throw new ViewParameterException("Required hint value for hint '" + HintEnum.RECLAIM_GROUP_AGED + "' value '" + hintValueMaxAge + "' could not be parsed as a double value");
            }

            String hintValueFrequency = HintEnum.RECLAIM_GROUP_FREQ.getHintAssignedValue(reclaimGroupAged);
            if (hintValueFrequency == null) {
                reclaimFrequency = reclaimMaxAge;
            } else {
                try {
                    reclaimFrequency = Double.parseDouble(hintValueFrequency);
                } catch (RuntimeException ex) {
                    throw new ViewParameterException("Required hint value for hint '" + HintEnum.RECLAIM_GROUP_FREQ + "' value '" + hintValueFrequency + "' could not be parsed as a double value");
                }
            }
            if (reclaimMaxAge < 0.100) {
                log.warn("Reclaim max age parameter is less then 100 milliseconds, are your sure?");
            }

            if (log.isDebugEnabled()) {
                log.debug("Using reclaim-aged strategy for group-window age " + reclaimMaxAge + " frequency " + reclaimFrequency);
            }
        }
    }

    public void attach(EventType parentEventType, StatementContext statementContext, ViewFactory optionalParentFactory, List parentViewFactories) throws ViewParameterException {
        criteriaExpressions = ViewFactorySupport.validate(getViewName(), parentEventType, statementContext, viewParameters, false);

        if (criteriaExpressions.length == 0) {
            String errorMessage = getViewName() + " view requires a one or more expressions provinding unique values as parameters";
            throw new ViewParameterException(errorMessage);
        }

        this.eventType = parentEventType;
    }

    /**
     * Returns the names of fields to group by
     *
     * @return field names
     */
    public ExprNode[] getCriteriaExpressions() {
        return criteriaExpressions;
    }

    public View makeView(AgentInstanceViewFactoryChainContext agentInstanceViewFactoryContext) {
        if (isReclaimAged) {
            return new GroupByViewReclaimAged(agentInstanceViewFactoryContext, criteriaExpressions, ExprNodeUtility.getEvaluators(criteriaExpressions), reclaimMaxAge, reclaimFrequency);
        }
        return new GroupByViewImpl(agentInstanceViewFactoryContext, criteriaExpressions, ExprNodeUtility.getEvaluators(criteriaExpressions));
    }

    public EventType getEventType() {
        return eventType;
    }

    public boolean canReuse(View view, AgentInstanceContext agentInstanceContext) {
        if (!(view instanceof GroupByView)) {
            return false;
        }

        if (isReclaimAged) {
            return false;
        }

        GroupByView myView = (GroupByView) view;
        if (!ExprNodeUtility.deepEquals(myView.getCriteriaExpressions(), criteriaExpressions)) {
            return false;
        }

        return true;
    }

    public boolean isReclaimAged() {
        return isReclaimAged;
    }

    public double getReclaimMaxAge() {
        return reclaimMaxAge;
    }

    public double getReclaimFrequency() {
        return reclaimFrequency;
    }

    public String getViewName() {
        return "Group-By";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy