Java tutorial
/* * 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.Level; 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.apache.rya.indexing.geotemporal.GeoTemporalOptimizer; import org.openrdf.model.URI; 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<URI> 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[] {})); } }