/*
***************************************************************************************
* 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.join.table;
import com.espertech.esper.client.EventType;
import com.espertech.esper.core.context.util.AgentInstanceContext;
import com.espertech.esper.epl.join.plan.QueryPlanIndexItem;
import com.espertech.esper.epl.lookup.EventTableIndexService;
import com.espertech.esper.util.CollectionUtil;
public class EventTableUtil {
/**
* Build an index/table instance using the event properties for the event type.
*
* @param indexedStreamNum - number of stream indexed
* @param eventType - type of event to expect
* @param optionalIndexName index name
* @param agentInstanceContext context
* @param item plan item
* @param optionalSerde serde if any
* @param isFireAndForget indicates fire-and-forget
* @param unique indicates unique
* @param coerceOnAddOnly indicator whether to coerce on value-add
* @return table build
*/
public static EventTable buildIndex(AgentInstanceContext agentInstanceContext, int indexedStreamNum, QueryPlanIndexItem item, EventType eventType, boolean coerceOnAddOnly, boolean unique, String optionalIndexName, Object optionalSerde, boolean isFireAndForget) {
String[] indexProps = item.getIndexProps();
Class[] indexCoercionTypes = normalize(item.getOptIndexCoercionTypes());
String[] rangeProps = item.getRangeProps();
Class[] rangeCoercionTypes = normalize(item.getOptRangeCoercionTypes());
EventTableFactoryTableIdentAgentInstance ident = new EventTableFactoryTableIdentAgentInstance(agentInstanceContext);
EventTableIndexService eventTableIndexService = agentInstanceContext.getStatementContext().getEventTableIndexService();
EventTable table;
if (item.getAdvancedIndexProvisionDesc() != null) {
table = eventTableIndexService.createCustom(optionalIndexName, indexedStreamNum, eventType, item.isUnique(), item.getAdvancedIndexProvisionDesc()).makeEventTables(ident, agentInstanceContext)[0];
} else if (rangeProps == null || rangeProps.length == 0) {
if (indexProps == null || indexProps.length == 0) {
EventTableFactory factory = eventTableIndexService.createUnindexed(indexedStreamNum, optionalSerde, isFireAndForget);
table = factory.makeEventTables(ident, agentInstanceContext)[0];
} else {
// single index key
if (indexProps.length == 1) {
if (indexCoercionTypes == null || indexCoercionTypes.length == 0) {
EventTableFactory factory = eventTableIndexService.createSingle(indexedStreamNum, eventType, indexProps[0], unique, optionalIndexName, optionalSerde, isFireAndForget);
table = factory.makeEventTables(ident, agentInstanceContext)[0];
} else {
if (coerceOnAddOnly) {
EventTableFactory factory = eventTableIndexService.createSingleCoerceAdd(indexedStreamNum, eventType, indexProps[0], indexCoercionTypes[0], optionalSerde, isFireAndForget);
table = factory.makeEventTables(ident, agentInstanceContext)[0];
} else {
EventTableFactory factory = eventTableIndexService.createSingleCoerceAll(indexedStreamNum, eventType, indexProps[0], indexCoercionTypes[0], optionalSerde, isFireAndForget);
table = factory.makeEventTables(ident, agentInstanceContext)[0];
}
}
} else {
// Multiple index keys
if (indexCoercionTypes == null || indexCoercionTypes.length == 0) {
EventTableFactory factory = eventTableIndexService.createMultiKey(indexedStreamNum, eventType, indexProps, unique, optionalIndexName, optionalSerde, isFireAndForget);
table = factory.makeEventTables(ident, agentInstanceContext)[0];
} else {
if (coerceOnAddOnly) {
EventTableFactory factory = eventTableIndexService.createMultiKeyCoerceAdd(indexedStreamNum, eventType, indexProps, indexCoercionTypes, isFireAndForget);
table = factory.makeEventTables(ident, agentInstanceContext)[0];
} else {
EventTableFactory factory = eventTableIndexService.createMultiKeyCoerceAll(indexedStreamNum, eventType, indexProps, indexCoercionTypes, isFireAndForget);
table = factory.makeEventTables(ident, agentInstanceContext)[0];
}
}
}
}
} else {
if ((rangeProps.length == 1) && (indexProps == null || indexProps.length == 0)) {
if (rangeCoercionTypes == null) {
EventTableFactory factory = eventTableIndexService.createSorted(indexedStreamNum, eventType, rangeProps[0], isFireAndForget);
return factory.makeEventTables(ident, agentInstanceContext)[0];
} else {
EventTableFactory factory = eventTableIndexService.createSortedCoerce(indexedStreamNum, eventType, rangeProps[0], rangeCoercionTypes[0], isFireAndForget);
return factory.makeEventTables(ident, agentInstanceContext)[0];
}
} else {
EventTableFactory factory = eventTableIndexService.createComposite(indexedStreamNum, eventType, indexProps, indexCoercionTypes, rangeProps, rangeCoercionTypes, isFireAndForget);
return factory.makeEventTables(ident, agentInstanceContext)[0];
}
}
return table;
}
private static Class[] normalize(Class[] types) {
if (types == null) {
return null;
}
if (CollectionUtil.isAllNullArray(types)) {
return null;
}
return types;
}
}