/*
***************************************************************************************
* 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.lookup;
import com.espertech.esper.epl.expression.core.ExprValidationException;
import com.espertech.esper.epl.join.plan.QueryPlanIndexItem;
import java.util.*;
public class EventTableIndexMetadata {
private final Map<IndexMultiKey, EventTableIndexMetadataEntry> indexes = new HashMap<IndexMultiKey, EventTableIndexMetadataEntry>();
public EventTableIndexMetadata() {
}
public void addIndexExplicit(boolean isPrimary, IndexMultiKey indexMultiKey, String explicitIndexName, QueryPlanIndexItem explicitIndexDesc, String statementName)
throws ExprValidationException {
if (getIndexByName(explicitIndexName) != null) {
throw new ExprValidationException("An index by name '" + explicitIndexName + "' already exists");
}
if (indexes.containsKey(indexMultiKey)) {
throw new ExprValidationException("An index for the same columns already exists");
}
EventTableIndexMetadataEntry entry = new EventTableIndexMetadataEntry(explicitIndexName, isPrimary, explicitIndexDesc, explicitIndexName);
entry.addReferringStatement(statementName);
indexes.put(indexMultiKey, entry);
}
public void addIndexNonExplicit(IndexMultiKey indexMultiKey, String statementName, QueryPlanIndexItem queryPlanIndexItem)
throws ExprValidationException {
if (indexes.containsKey(indexMultiKey)) {
return;
}
EventTableIndexMetadataEntry entry = new EventTableIndexMetadataEntry(null, false, queryPlanIndexItem, null);
entry.addReferringStatement(statementName);
indexes.put(indexMultiKey, entry);
}
public Map<IndexMultiKey, EventTableIndexMetadataEntry> getIndexes() {
return indexes;
}
public void removeIndex(IndexMultiKey imk) {
indexes.remove(imk);
}
public boolean removeIndexReference(IndexMultiKey index, String referringStatementName) {
EventTableIndexMetadataEntry entry = indexes.get(index);
if (entry == null) {
return false;
}
return entry.removeReferringStatement(referringStatementName);
}
public void addIndexReference(String indexName, String statementName) {
Map.Entry<IndexMultiKey, EventTableIndexMetadataEntry> entry = findIndex(indexName);
if (entry == null) {
return;
}
entry.getValue().addReferringStatement(statementName);
}
public void addIndexReference(IndexMultiKey indexMultiKey, String statementName) {
EventTableIndexMetadataEntry entry = indexes.get(indexMultiKey);
if (entry == null) {
return;
}
entry.addReferringStatement(statementName);
}
public IndexMultiKey getIndexByName(String indexName) {
Map.Entry<IndexMultiKey, EventTableIndexMetadataEntry> entry = findIndex(indexName);
if (entry == null) {
return null;
}
return entry.getKey();
}
public Collection<String> getRemoveRefIndexesDereferenced(String statementName) {
Collection<String> indexNamesDerrefd = null;
for (Map.Entry<IndexMultiKey, EventTableIndexMetadataEntry> entry : indexes.entrySet()) {
boolean last = entry.getValue().removeReferringStatement(statementName);
if (last) {
if (indexNamesDerrefd == null) {
indexNamesDerrefd = new ArrayDeque<String>(2);
}
indexNamesDerrefd.add(entry.getValue().getOptionalIndexName());
}
}
if (indexNamesDerrefd == null) {
return Collections.emptyList();
}
for (String name : indexNamesDerrefd) {
removeIndex(getIndexByName(name));
}
return indexNamesDerrefd;
}
private Map.Entry<IndexMultiKey, EventTableIndexMetadataEntry> findIndex(String indexName) {
for (Map.Entry<IndexMultiKey, EventTableIndexMetadataEntry> entry : indexes.entrySet()) {
if (entry.getValue().getOptionalIndexName() != null && entry.getValue().getOptionalIndexName().equals(indexName)) {
return entry;
}
}
return null;
}
public String[][] getUniqueIndexProps() {
ArrayDeque<String[]> uniques = new ArrayDeque<String[]>(2);
for (Map.Entry<IndexMultiKey, EventTableIndexMetadataEntry> entry : indexes.entrySet()) {
if (entry.getKey().isUnique()) {
String[] props = new String[entry.getKey().getHashIndexedProps().length];
for (int i = 0; i < entry.getKey().getHashIndexedProps().length; i++) {
props[i] = entry.getKey().getHashIndexedProps()[i].getIndexPropName();
}
uniques.add(props);
}
}
return uniques.toArray(new String[uniques.size()][]);
}
}