/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ /* * PrimaryIndexCreationHelper.java * * Created on March 20, 2005, 7:21 PM */ package org.apache.geode.cache.query.internal.index; import java.util.List; import org.apache.geode.cache.Cache; import org.apache.geode.cache.Region; import org.apache.geode.cache.query.IndexInvalidException; import org.apache.geode.cache.query.internal.CompiledIteratorDef; import org.apache.geode.cache.query.internal.CompiledValue; import org.apache.geode.cache.query.internal.ExecutionContext; import org.apache.geode.cache.query.internal.RuntimeIterator; import org.apache.geode.cache.query.internal.parse.OQLLexerTokenTypes; import org.apache.geode.internal.cache.PartitionedRegion; import org.apache.geode.internal.i18n.LocalizedStrings; /** * */ public class PrimaryKeyIndexCreationHelper extends IndexCreationHelper { ExecutionContext context = null; final Region region; public PrimaryKeyIndexCreationHelper(String fromClause, String indexedExpression, String projectionAttributes, Cache cache, ExecutionContext externalContext, IndexManager imgr) throws IndexInvalidException { super(fromClause, projectionAttributes, cache); if (externalContext == null) { context = new ExecutionContext(null, cache); } else { this.context = externalContext; } context.newScope(1); this.region = imgr.region; prepareFromClause(imgr); prepareIndexExpression(indexedExpression); prepareProjectionAttributes(projectionAttributes); } private void prepareFromClause(IndexManager imgr) throws IndexInvalidException { List list = this.compiler.compileFromClause(fromClause); if (list.size() > 1) { throw new IndexInvalidException( LocalizedStrings.PrimaryKeyIndexCreationHelper_THE_FROMCLAUSE_FOR_A_PRIMARY_KEY_INDEX_SHOULD_ONLY_HAVE_ONE_ITERATOR_AND_THE_COLLECTION_MUST_BE_A_REGION_PATH_ONLY .toLocalizedString()); } try { CompiledIteratorDef iterDef = (CompiledIteratorDef) list.get(0); if (iterDef.getCollectionExpr().getType() != OQLLexerTokenTypes.RegionPath) { throw new IndexInvalidException( LocalizedStrings.PrimaryKeyIndexCreationHelper_THE_FROMCLAUSE_FOR_A_PRIMARY_KEY_INDEX_SHOULD_BE_A_REGION_PATH_ONLY .toLocalizedString()); } iterDef.computeDependencies(this.context); RuntimeIterator rIter = (iterDef.getRuntimeIterator(this.context)); String definition = rIter.getDefinition(); this.canonicalizedIteratorDefinitions = new String[1]; this.canonicalizedIteratorDefinitions[0] = definition; // Asif: Bind the Index_Internal_ID to the RuntimeIterator PartitionedRegion pr = this.context.getPartitionedRegion(); this.canonicalizedIteratorNames = new String[1]; String name = null; if (pr != null) { name = pr.getIndexManager().putCanonicalizedIteratorNameIfAbsent(definition); } else { name = imgr.putCanonicalizedIteratorNameIfAbsent(definition); } rIter.setIndexInternalID(name); this.canonicalizedIteratorNames = new String[1]; this.canonicalizedIteratorNames[0] = name; this.fromClause = new StringBuffer(definition).append(' ').append(name).toString(); context.bindIterator(rIter); } catch (IndexInvalidException e) { throw e; // propagate } catch (Exception e) { throw new IndexInvalidException(e); // wrap any other exceptions } } private void prepareIndexExpression(String indexedExpression) throws IndexInvalidException { List indexedExprs = this.compiler.compileProjectionAttributes(indexedExpression); if (indexedExprs == null || indexedExprs.size() != 1) { throw new IndexInvalidException( LocalizedStrings.PrimaryKeyIndexCreationHelper_INVALID_INDEXED_EXPRESSOION_0 .toLocalizedString(indexedExpression)); } CompiledValue expr = (CompiledValue) ((Object[]) indexedExprs.get(0))[1]; if (expr.getType() == CompiledValue.LITERAL) throw new IndexInvalidException( LocalizedStrings.PrimaryKeyIndexCreationHelper_INVALID_INDEXED_EXPRESSOION_0 .toLocalizedString(indexedExpression)); try { StringBuffer sb = new StringBuffer(); expr.generateCanonicalizedExpression(sb, context); this.indexedExpression = sb.toString(); } catch (Exception e) { // e.printStackTrace(); throw new IndexInvalidException( LocalizedStrings.PrimaryKeyIndexCreationHelper_INVALID_INDEXED_EXPRESSOION_0_N_1 .toLocalizedString(new Object[] {indexedExpression, e.getMessage()})); } } private void prepareProjectionAttributes(String projectionAttributes) throws IndexInvalidException { if (projectionAttributes != null && !projectionAttributes.equals("*")) { throw new IndexInvalidException( LocalizedStrings.PrimaryKeyIndexCreationHelper_INVALID_PROJECTION_ATTRIBUTES_0 .toLocalizedString(projectionAttributes)); } this.projectionAttributes = projectionAttributes; } public Region getRegion() { return region; } public List getIterators() { return null; } public CompiledValue getCompiledIndexedExpression() { return null; } }