blob: 42331ea063ded177bf25a008dca42db83fa68308 [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.rya.indexing.accumulo.geo;
import java.util.List;
import java.util.Set;
import org.apache.hadoop.conf.Configuration;
import org.apache.log4j.Logger;
import org.apache.rya.accumulo.AccumuloRdfConfiguration;
import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
import org.apache.rya.api.instance.RyaDetails;
import org.apache.rya.indexing.FilterFunctionOptimizer;
import org.apache.rya.indexing.GeoEnabledFilterFunctionOptimizer;
import org.apache.rya.indexing.GeoIndexerType;
import org.apache.rya.indexing.GeoTemporalIndexerType;
import org.apache.rya.indexing.accumulo.ConfigUtils;
import org.eclipse.rdf4j.model.IRI;
import com.google.common.collect.Lists;
/**
* A set of configuration utils to read a Hadoop {@link Configuration} object and create Cloudbase/Accumulo objects.
* Soon will deprecate this class. Use installer for the set methods, use {@link RyaDetails} for the get methods.
* New code must separate parameters that are set at Rya install time from that which is specific to the client.
* Also Accumulo index tables are pushed down to the implementation and not configured in conf.
*/
public class OptionalConfigUtils extends ConfigUtils {
private static final Logger logger = Logger.getLogger(OptionalConfigUtils.class);
public static final String GEO_NUM_PARTITIONS = "sc.geo.numPartitions";
public static final String USE_GEO = "sc.use_geo";
public static final String USE_GEOTEMPORAL = "sc.use_geotemporal";
public static final String USE_FREETEXT = "sc.use_freetext";
public static final String USE_TEMPORAL = "sc.use_temporal";
public static final String USE_ENTITY = "sc.use_entity";
public static final String USE_PCJ = "sc.use_pcj";
public static final String USE_OPTIMAL_PCJ = "sc.use.optimal.pcj";
public static final String USE_PCJ_UPDATER_INDEX = "sc.use.updater";
public static final String GEO_PREDICATES_LIST = "sc.geo.predicates";
public static final String GEO_INDEXER_TYPE = "sc.geo.geo_indexer_type";
public static Set<IRI> getGeoPredicates(final Configuration conf) {
return getPredicates(conf, GEO_PREDICATES_LIST);
}
public static int getGeoNumPartitions(final Configuration conf) {
return conf.getInt(GEO_NUM_PARTITIONS, getNumPartitions(conf));
}
public static boolean getUseGeo(final Configuration conf) {
return conf.getBoolean(USE_GEO, false);
}
public static boolean getUseGeoTemporal(final Configuration conf) {
return conf.getBoolean(USE_GEOTEMPORAL, false);
}
/**
* Retrieves the value for the geo indexer type from the config.
* @param conf the {@link Configuration}.
* @return the {@link GeoIndexerType} found in the config or
* {@code UNSPECIFIED} if it doesn't exist.
*/
public static GeoIndexerType getGeoIndexerType(final Configuration conf) {
String confType[] = conf.getStrings(GEO_INDEXER_TYPE, GeoIndexerType.UNSPECIFIED.name());
try {
return GeoIndexerType.valueOf(GeoIndexerType.class, confType[0]);
} catch (IllegalArgumentException e) {
// if none matched, invalid configuration, fail fast.
// this is where you can allow putting any classname in the configuration.
throw new Error("Configuration contains an unknown GeoIndexerType, found: \""+GEO_INDEXER_TYPE+"\"="+confType[0]);
}
}
public static void setIndexers(final RdfCloudTripleStoreConfiguration conf) {
final List<String> indexList = Lists.newArrayList();
final List<String> optimizers = Lists.newArrayList();
boolean useFilterIndex = false;
ConfigUtils.setIndexers(conf);
final String[] existingIndexers = conf.getStrings(AccumuloRdfConfiguration.CONF_ADDITIONAL_INDEXERS);
if(existingIndexers != null ) {
for (final String index : existingIndexers) {
indexList.add(index);
}
for (final String optimizer : conf.getStrings(RdfCloudTripleStoreConfiguration.CONF_OPTIMIZERS)){
optimizers.add(optimizer);
}
}
final GeoIndexerType geoIndexerType = getGeoIndexerType(conf);
if (ConfigUtils.getUseMongo(conf)) {
if (getUseGeo(conf)) {
if (geoIndexerType == GeoIndexerType.UNSPECIFIED) {
// Default to MongoGeoIndexer if not specified
indexList.add(GeoIndexerType.MONGO_DB.getGeoIndexerClassString());
} else {
indexList.add(geoIndexerType.getGeoIndexerClassString());
}
useFilterIndex = true;
}
if (getUseGeoTemporal(conf)) {
indexList.add(GeoTemporalIndexerType.MONGO_GEO_TEMPORAL.getGeoTemporalIndexerClassString());
optimizers.add(GeoTemporalIndexerType.MONGO_GEO_TEMPORAL_OPTIMIZER.getGeoTemporalIndexerClassString());
}
} else {
if (getUseGeo(conf)) {
if (geoIndexerType == GeoIndexerType.UNSPECIFIED) {
// Default to GeoMesaGeoIndexer if not specified
indexList.add(GeoIndexerType.GEO_MESA.getGeoIndexerClassString());
} else {
indexList.add(geoIndexerType.getGeoIndexerClassString());
}
useFilterIndex = true;
}
}
if (useFilterIndex) {
optimizers.remove(FilterFunctionOptimizer.class.getName());
optimizers.add(GeoEnabledFilterFunctionOptimizer.class.getName());
}
conf.setStrings(AccumuloRdfConfiguration.CONF_ADDITIONAL_INDEXERS, indexList.toArray(new String[]{}));
conf.setStrings(RdfCloudTripleStoreConfiguration.CONF_OPTIMIZERS, optimizers.toArray(new String[]{}));
}
}