blob: 949c58a6b1cee1e798ae7f84d7ec45a4784e09f2 [file] [log] [blame]
/*
* 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.
*/
package org.apache.carbondata.core.index;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.carbondata.common.annotations.InterfaceAudience;
import org.apache.carbondata.common.annotations.InterfaceStability;
import org.apache.carbondata.common.exceptions.MetadataProcessException;
import org.apache.carbondata.common.exceptions.sql.MalformedIndexCommandException;
import org.apache.carbondata.core.index.dev.Index;
import org.apache.carbondata.core.index.dev.IndexFactory;
import org.apache.carbondata.core.metadata.index.IndexType;
import org.apache.carbondata.core.metadata.schema.table.CarbonTable;
import org.apache.carbondata.core.metadata.schema.table.IndexSchema;
/**
* Developer can register a index implementation with a short name.
* After registration, user can use short name to create the index, like
* <p>
* {@code
* CREATE index dm ON TABLE table
* USING 'short-name-of-the-index'
* }
* otherwise, user should use the class name of the index implementation to create the index
* (subclass of {@link IndexFactory})
* <p>
* {@code
* CREATE index dm ON TABLE table
* USING 'class-name-of-the-index'
* }
*/
@InterfaceAudience.Developer("Index")
@InterfaceStability.Evolving
public class IndexRegistry {
private static Map<String, String> shortNameToClassName = new ConcurrentHashMap<>();
private static void registerIndex(String indexClassName, String shortName) {
Objects.requireNonNull(indexClassName);
Objects.requireNonNull(shortName);
shortNameToClassName.put(shortName, indexClassName);
}
private static String getIndexClassName(String shortName) {
Objects.requireNonNull(shortName);
return shortNameToClassName.get(shortName);
}
public static IndexFactory<? extends Index> getIndexFactoryByShortName(
CarbonTable table, IndexSchema indexSchema) throws MalformedIndexCommandException {
String providerName = indexSchema.getProviderName();
try {
registerIndex(
IndexType.get(providerName).getClassName(),
IndexType.get(providerName).getIndexProviderName());
} catch (UnsupportedOperationException ex) {
throw new MalformedIndexCommandException("Index '" + providerName + "' not found", ex);
}
IndexFactory<? extends Index> indexFactory;
String className = getIndexClassName(providerName.toLowerCase());
if (className != null) {
try {
indexFactory = (IndexFactory<? extends Index>)
Class.forName(className).getConstructors()[0].newInstance(table, indexSchema);
} catch (ClassNotFoundException ex) {
throw new MalformedIndexCommandException("Index '" + providerName + "' not found", ex);
} catch (InvocationTargetException ex) {
throw new MalformedIndexCommandException(ex.getTargetException().getMessage());
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException ex) {
throw new MetadataProcessException(
"failed to create Index '" + providerName + "': " + ex.getMessage(), ex);
}
} else {
throw new MalformedIndexCommandException("Index '" + providerName + "' not found");
}
return indexFactory;
}
}