/* *************************************************************************************** * 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.epl.table.strategy; import com.espertech.esper.epl.agg.access.AggregationAccessorSlotPair; import com.espertech.esper.epl.expression.core.ExprEvaluator; import com.espertech.esper.epl.expression.core.ExprNode; import com.espertech.esper.epl.expression.table.*; import com.espertech.esper.epl.table.mgmt.TableMetadata; import com.espertech.esper.epl.table.mgmt.TableMetadataColumn; import com.espertech.esper.epl.table.mgmt.TableMetadataColumnAggregation; import com.espertech.esper.epl.table.mgmt.TableMetadataColumnPlain; public class ExprTableEvalStrategyFactory { public static ExprEvaluator getTableAccessEvalStrategy(ExprNode exprNode, String tableName, Integer streamNum, TableMetadataColumnAggregation agg) { if (!agg.getFactory().isAccessAggregation()) { return new ExprTableExprEvaluatorMethod(exprNode, tableName, agg.getColumnName(), streamNum, agg.getFactory().getResultType(), agg.getMethodOffset()); } else { return new ExprTableExprEvaluatorAccess(exprNode, tableName, agg.getColumnName(), streamNum, agg.getFactory().getResultType(), agg.getAccessAccessorSlotPair(), agg.getOptionalEventType()); } } public static ExprTableAccessEvalStrategy getTableAccessEvalStrategy(ExprTableAccessNode tableNode, TableAndLockProvider provider, TableMetadata tableMetadata) { ExprEvaluator[] groupKeyEvals = tableNode.getGroupKeyEvaluators(); TableAndLockProviderUngrouped ungrouped; TableAndLockProviderGrouped grouped; if (provider instanceof TableAndLockProviderUngrouped) { ungrouped = (TableAndLockProviderUngrouped) provider; grouped = null; } else { grouped = (TableAndLockProviderGrouped) provider; ungrouped = null; } // handle sub-property access if (tableNode instanceof ExprTableAccessNodeSubprop) { ExprTableAccessNodeSubprop subprop = (ExprTableAccessNodeSubprop) tableNode; TableMetadataColumn column = tableMetadata.getTableColumns().get(subprop.getSubpropName()); return getTableAccessSubprop(subprop, column, ungrouped, grouped); } // handle top-level access if (tableNode instanceof ExprTableAccessNodeTopLevel) { if (ungrouped != null) { return new ExprTableEvalStrategyUngroupedTopLevel(ungrouped, tableMetadata.getTableColumns()); } if (tableNode.getGroupKeyEvaluators().length > 1) { return new ExprTableEvalStrategyGroupByTopLevelMulti(grouped, tableMetadata.getTableColumns(), groupKeyEvals); } return new ExprTableEvalStrategyGroupByTopLevelSingle(grouped, tableMetadata.getTableColumns(), groupKeyEvals[0]); } // handle "keys" function access if (tableNode instanceof ExprTableAccessNodeKeys) { return new ExprTableEvalStrategyGroupByKeys(grouped); } // handle access-aggregator accessors if (tableNode instanceof ExprTableAccessNodeSubpropAccessor) { ExprTableAccessNodeSubpropAccessor accessorProvider = (ExprTableAccessNodeSubpropAccessor) tableNode; TableMetadataColumnAggregation column = (TableMetadataColumnAggregation) tableMetadata.getTableColumns().get(accessorProvider.getSubpropName()); if (ungrouped != null) { AggregationAccessorSlotPair pair = column.getAccessAccessorSlotPair(); return new ExprTableEvalStrategyUngroupedAccess(ungrouped, pair.getSlot(), accessorProvider.getAccessor()); } AggregationAccessorSlotPair pair = new AggregationAccessorSlotPair(column.getAccessAccessorSlotPair().getSlot(), accessorProvider.getAccessor()); if (tableNode.getGroupKeyEvaluators().length > 1) { return new ExprTableEvalStrategyGroupByAccessMulti(grouped, pair, groupKeyEvals); } return new ExprTableEvalStrategyGroupByAccessSingle(grouped, pair, groupKeyEvals[0]); } throw new IllegalStateException("Unrecognized table access node " + tableNode); } private static ExprTableAccessEvalStrategy getTableAccessSubprop(ExprTableAccessNodeSubprop subprop, TableMetadataColumn column, TableAndLockProviderUngrouped ungrouped, TableAndLockProviderGrouped grouped) { if (column instanceof TableMetadataColumnPlain) { TableMetadataColumnPlain plain = (TableMetadataColumnPlain) column; if (ungrouped != null) { return new ExprTableEvalStrategyUngroupedProp(ungrouped, plain.getIndexPlain(), subprop.getOptionalPropertyEnumEvaluator()); } if (subprop.getGroupKeyEvaluators().length > 1) { return new ExprTableEvalStrategyGroupByPropMulti(grouped, plain.getIndexPlain(), subprop.getOptionalPropertyEnumEvaluator(), subprop.getGroupKeyEvaluators()); } return new ExprTableEvalStrategyGroupByPropSingle(grouped, plain.getIndexPlain(), subprop.getOptionalPropertyEnumEvaluator(), subprop.getGroupKeyEvaluators()[0]); } TableMetadataColumnAggregation aggcol = (TableMetadataColumnAggregation) column; if (ungrouped != null) { if (!aggcol.getFactory().isAccessAggregation()) { return new ExprTableEvalStrategyUngroupedMethod(ungrouped, aggcol.getMethodOffset()); } AggregationAccessorSlotPair pair = aggcol.getAccessAccessorSlotPair(); return new ExprTableEvalStrategyUngroupedAccess(ungrouped, pair.getSlot(), pair.getAccessor()); } TableMetadataColumnAggregation columnAggregation = (TableMetadataColumnAggregation) column; if (!columnAggregation.getFactory().isAccessAggregation()) { if (subprop.getGroupKeyEvaluators().length > 1) { return new ExprTableEvalStrategyGroupByMethodMulti(grouped, columnAggregation.getMethodOffset(), subprop.getGroupKeyEvaluators()); } return new ExprTableEvalStrategyGroupByMethodSingle(grouped, columnAggregation.getMethodOffset(), subprop.getGroupKeyEvaluators()[0]); } if (subprop.getGroupKeyEvaluators().length > 1) { return new ExprTableEvalStrategyGroupByAccessMulti(grouped, columnAggregation.getAccessAccessorSlotPair(), subprop.getGroupKeyEvaluators()); } return new ExprTableEvalStrategyGroupByAccessSingle(grouped, columnAggregation.getAccessAccessorSlotPair(), subprop.getGroupKeyEvaluators()[0]); } }