/*
***************************************************************************************
* 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.core.service;
import com.espertech.esper.epl.table.mgmt.TableMetadata;
import com.espertech.esper.epl.virtualdw.VirtualDWViewProviderForAgentInstance;
import com.espertech.esper.view.ViewFactoryChain;
import com.espertech.esper.view.ViewServiceHelper;
import java.lang.annotation.Annotation;
import java.util.Set;
/**
* Analysis result for joins.
*/
public class StreamJoinAnalysisResult {
private final int numStreams;
private boolean[] isUnidirectionalInd;
private boolean[] isUnidirectionalNonDriving;
private boolean isPureSelfJoin;
private boolean[] hasChildViews;
private boolean[] isNamedWindow;
private VirtualDWViewProviderForAgentInstance[] viewExternal;
private String[][][] uniqueKeys;
private TableMetadata[] tablesPerStream;
private boolean unidirectionalAll;
/**
* Ctor.
*
* @param numStreams number of streams
*/
public StreamJoinAnalysisResult(int numStreams) {
this.numStreams = numStreams;
isPureSelfJoin = false;
isUnidirectionalInd = new boolean[numStreams];
isUnidirectionalNonDriving = new boolean[numStreams];
hasChildViews = new boolean[numStreams];
isNamedWindow = new boolean[numStreams];
viewExternal = new VirtualDWViewProviderForAgentInstance[numStreams];
uniqueKeys = new String[numStreams][][];
tablesPerStream = new TableMetadata[numStreams];
}
/**
* Sets flag.
*
* @param index index
*/
public void setUnidirectionalInd(int index) {
isUnidirectionalInd[index] = true;
}
/**
* Sets flag.
*
* @param index index
*/
public void setUnidirectionalNonDriving(int index) {
isUnidirectionalNonDriving[index] = true;
}
/**
* Sets self-join.
*
* @param pureSelfJoin if a self join
*/
public void setPureSelfJoin(boolean pureSelfJoin) {
isPureSelfJoin = pureSelfJoin;
}
/**
* Sets child view flags.
*
* @param index to set
*/
public void setHasChildViews(int index) {
this.hasChildViews[index] = true;
}
/**
* Returns unidirection ind.
*
* @return unidirectional flags
*/
public boolean[] getUnidirectionalInd() {
return isUnidirectionalInd;
}
/**
* Returns non-driving unidirectional streams when partial self-joins.
*
* @return indicators
*/
public boolean[] getUnidirectionalNonDriving() {
return isUnidirectionalNonDriving;
}
/**
* True for self-join.
*
* @return self-join
*/
public boolean isPureSelfJoin() {
return isPureSelfJoin;
}
/**
* Returns child view flags.
*
* @return flags
*/
public boolean[] getHasChildViews() {
return hasChildViews;
}
/**
* Return named window flags.
*
* @return flags
*/
public boolean[] getNamedWindow() {
return isNamedWindow;
}
/**
* Sets named window flag
*
* @param index to set
*/
public void setNamedWindow(int index) {
isNamedWindow[index] = true;
}
/**
* Returns streams num.
*
* @return num
*/
public int getNumStreams() {
return numStreams;
}
public VirtualDWViewProviderForAgentInstance[] getViewExternal() {
return viewExternal;
}
public String[][][] getUniqueKeys() {
return uniqueKeys;
}
public void setTablesForStream(int streamNum, TableMetadata metadata) {
this.tablesPerStream[streamNum] = metadata;
}
public TableMetadata[] getTablesPerStream() {
return tablesPerStream;
}
public void addUniquenessInfo(ViewFactoryChain[] unmaterializedViewChain, Annotation[] annotations) {
for (int i = 0; i < unmaterializedViewChain.length; i++) {
if (unmaterializedViewChain[i].getDataWindowViewFactoryCount() > 0) {
Set<String> uniquenessProps = ViewServiceHelper.getUniqueCandidateProperties(unmaterializedViewChain[i].getViewFactoryChain(), annotations);
if (uniquenessProps != null) {
uniqueKeys[i] = new String[1][];
uniqueKeys[i][0] = uniquenessProps.toArray(new String[uniquenessProps.size()]);
}
}
}
}
public boolean isUnidirectional() {
for (boolean ind : isUnidirectionalInd) {
if (ind) {
return true;
}
}
return false;
}
public int getUnidirectionalStreamNumberFirst() {
for (int i = 0; i < isUnidirectionalInd.length; i++) {
if (isUnidirectionalInd[i]) {
return i;
}
}
throw new IllegalStateException();
}
public boolean isUnidirectionalAll() {
for (boolean ind : isUnidirectionalInd) {
if (!ind) {
return false;
}
}
return true;
}
public int getUnidirectionalCount() {
int count = 0;
for (boolean ind : isUnidirectionalInd) {
count += ind ? 1 : 0;
}
return count;
}
}