/*
***************************************************************************************
* 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.internal;
import com.espertech.esper.client.EventType;
import com.espertech.esper.collection.ViewUpdatedCollection;
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.prior.ExprPriorNode;
import com.espertech.esper.view.*;
import java.util.List;
import java.util.SortedMap;
/**
* Factory for making {@link PriorEventView} instances.
*/
public class PriorEventViewFactory implements ViewFactory {
private EventType eventType;
/**
* unbound to indicate the we are not receiving remove stream events (unbound stream, stream without child
* views) therefore must use a different buffer.
*/
protected boolean isUnbound;
public void setViewParameters(ViewFactoryContext viewFactoryContext, List<ExprNode> expressionParameters) throws ViewParameterException {
if (expressionParameters.size() != 1) {
throw new ViewParameterException("View requires a single parameter indicating unbound or not");
}
isUnbound = (Boolean) ViewFactorySupport.validateAndEvaluate(getViewName(), viewFactoryContext.getStatementContext(), expressionParameters.get(0));
}
public void attach(EventType parentEventType, StatementContext statementContext, ViewFactory optionalParentFactory, List<ViewFactory> parentViewFactories) throws ViewParameterException {
eventType = parentEventType;
}
public View makeView(AgentInstanceViewFactoryChainContext agentInstanceViewFactoryContext) {
return new PriorEventView(agentInstanceViewFactoryContext.getPriorViewUpdatedCollection());
}
public ViewUpdatedCollection makeViewUpdatedCollection(SortedMap<Integer, List<ExprPriorNode>> callbacksPerIndex, int agentInstanceId) {
if (callbacksPerIndex.isEmpty()) {
throw new IllegalStateException("No resources requested");
}
// Construct an array of requested prior-event indexes (such as 10th prior event, 8th prior = {10, 8})
int[] requested = new int[callbacksPerIndex.size()];
int count = 0;
for (int reqIndex : callbacksPerIndex.keySet()) {
requested[count++] = reqIndex;
}
// For unbound streams the buffer is strictly rolling new events
if (isUnbound) {
return new PriorEventBufferUnbound(callbacksPerIndex.lastKey());
} else if (requested.length == 1) {
// For bound streams (with views posting old and new data), and if only one prior index requested
return new PriorEventBufferSingle(requested[0]);
} else {
// For bound streams (with views posting old and new data)
// Multiple prior event indexes requested, such as "prior(2, price), prior(8, price)"
// Sharing a single viewUpdatedCollection for multiple prior-event indexes
return new PriorEventBufferMulti(requested);
}
}
public EventType getEventType() {
return eventType;
}
public boolean canReuse(View view, AgentInstanceContext agentInstanceContext) {
return false;
}
public String getViewName() {
return "Prior-Event";
}
}