blob: 1769e1638f3bbdfb642f06114e7146efcff68ba7 [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.util;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.carbondata.common.constants.LoggerAction;
import org.apache.carbondata.common.logging.LogServiceFactory;
import org.apache.carbondata.core.cache.CacheProvider;
import org.apache.carbondata.core.constants.CarbonCommonConstants;
import org.apache.carbondata.core.constants.CarbonLoadOptionConstants;
import org.apache.carbondata.core.exception.InvalidConfigurationException;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.CARBON_CUSTOM_BLOCK_DISTRIBUTION;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.CARBON_ENABLE_INDEX_SERVER;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.CARBON_MAJOR_COMPACTION_SIZE;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.CARBON_PUSH_ROW_FILTERS_FOR_VECTOR;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.COMPACTION_SEGMENT_LEVEL_THRESHOLD;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.ENABLE_AUTO_LOAD_MERGE;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.ENABLE_OFFHEAP_SORT;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.ENABLE_UNSAFE_IN_QUERY_EXECUTION;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.ENABLE_UNSAFE_SORT;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.ENABLE_VECTOR_READER;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.NUM_CORES_COMPACTING;
import static org.apache.carbondata.core.constants.CarbonCommonConstants.NUM_CORES_LOADING;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_BAD_RECORDS_ACTION;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_BAD_RECORDS_LOGGER_ENABLE;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_BAD_RECORD_PATH;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_DATEFORMAT;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_GLOBAL_SORT_PARTITIONS;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_IS_EMPTY_DATA_BAD_RECORD;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_SERIALIZATION_NULL_FORMAT;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_SINGLE_PASS;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_SORT_SCOPE;
import static org.apache.carbondata.core.constants.CarbonLoadOptionConstants.CARBON_OPTIONS_TIMESTAMPFORMAT;
import static org.apache.carbondata.core.constants.CarbonV3DataFormatConstants.BLOCKLET_SIZE_IN_MB;
import org.apache.log4j.Logger;
/**
* This class maintains carbon session params
*/
public class SessionParams implements Serializable, Cloneable {
private static final Logger LOGGER =
LogServiceFactory.getLogService(CacheProvider.class.getName());
private static final long serialVersionUID = -7801994600594915264L;
private Map<String, String> sProps;
private ConcurrentHashMap<String, String> addedProps;
// below field to be used when we want the objects to be serialized
private Map<String, Object> extraInfo;
public SessionParams() {
sProps = new HashMap<>();
addedProps = new ConcurrentHashMap<>();
extraInfo = new HashMap<>();
}
public void setExtraInfo(String key, Object value) {
this.extraInfo.put(key, value);
}
public Object getExtraInfo(String key) {
return this.extraInfo.get(key);
}
/**
* This method will be used to get the properties value
*
* @param key
* @return properties value
*/
public String getProperty(String key) {
return sProps.get(key);
}
public String getProperty(String key, String defaultValue) {
if (!sProps.containsKey(key)) {
return defaultValue;
}
return sProps.get(key);
}
/**
* This method will be used to add a new property
*
* @param key
* @return properties value
*/
public SessionParams addProperty(String key, String value) throws InvalidConfigurationException {
boolean isValidConf = validateKeyValue(key, value);
if (isValidConf) {
if (key.equals(CarbonLoadOptionConstants.CARBON_OPTIONS_BAD_RECORDS_ACTION)) {
value = value.toUpperCase();
}
LOGGER.info(
"The key " + key + " with value " + value + " added in the session param");
sProps.put(key, value);
}
return this;
}
public Map<String, String> getAll() {
return sProps;
}
public SessionParams addProps(Map<String, String> addedProps) {
this.addedProps.putAll(addedProps);
return this;
}
public Map<String, String> getAddedProps() {
return addedProps;
}
/**
* validate the key value to be set using set command
* @param key
* @param value
* @return
* @throws InvalidConfigurationException
*/
private boolean validateKeyValue(String key, String value) throws InvalidConfigurationException {
boolean isValid = false;
switch (key) {
case ENABLE_UNSAFE_SORT:
case ENABLE_OFFHEAP_SORT:
case CARBON_CUSTOM_BLOCK_DISTRIBUTION:
case CARBON_OPTIONS_BAD_RECORDS_LOGGER_ENABLE:
case CARBON_OPTIONS_IS_EMPTY_DATA_BAD_RECORD:
case CARBON_OPTIONS_SINGLE_PASS:
case ENABLE_VECTOR_READER:
case ENABLE_UNSAFE_IN_QUERY_EXECUTION:
case ENABLE_AUTO_LOAD_MERGE:
case CARBON_PUSH_ROW_FILTERS_FOR_VECTOR:
case CARBON_ENABLE_INDEX_SERVER:
isValid = CarbonUtil.validateBoolean(value);
if (!isValid) {
throw new InvalidConfigurationException("Invalid value " + value + " for key " + key);
}
break;
case CARBON_OPTIONS_BAD_RECORDS_ACTION:
try {
LoggerAction.valueOf(value.toUpperCase());
isValid = true;
} catch (IllegalArgumentException iae) {
throw new InvalidConfigurationException(
"The key " + key + " can have only either FORCE or IGNORE or REDIRECT or FAIL.");
}
break;
case CARBON_OPTIONS_SORT_SCOPE:
isValid = CarbonUtil.isValidSortOption(value);
if (!isValid) {
throw new InvalidConfigurationException("The sort scope " + key
+ " can have only either NO_SORT, LOCAL_SORT or GLOBAL_SORT.");
}
break;
case CARBON_OPTIONS_GLOBAL_SORT_PARTITIONS:
case NUM_CORES_LOADING:
case NUM_CORES_COMPACTING:
case BLOCKLET_SIZE_IN_MB:
case CARBON_MAJOR_COMPACTION_SIZE:
isValid = CarbonUtil.validateValidIntType(value);
if (!isValid) {
throw new InvalidConfigurationException(
"The configured value for key " + key + " must be valid integer.");
}
break;
case CARBON_OPTIONS_BAD_RECORD_PATH:
isValid = CarbonUtil.isValidBadStorePath(value);
if (!isValid) {
throw new InvalidConfigurationException("Invalid bad records location.");
}
break;
// no validation needed while set for CARBON_OPTIONS_DATEFORMAT
case CARBON_OPTIONS_DATEFORMAT:
isValid = true;
break;
// no validation needed while set for CARBON_OPTIONS_TIMESTAMPFORMAT
case CARBON_OPTIONS_TIMESTAMPFORMAT:
isValid = true;
break;
// no validation needed while set for CARBON_OPTIONS_SERIALIZATION_NULL_FORMAT
case CARBON_OPTIONS_SERIALIZATION_NULL_FORMAT:
isValid = true;
break;
case COMPACTION_SEGMENT_LEVEL_THRESHOLD:
int[] values = CarbonProperties.getInstance().getIntArray(value);
if (values.length != 2) {
throw new InvalidConfigurationException(
"Invalid COMPACTION_SEGMENT_LEVEL_THRESHOLD: " + value);
}
isValid = true;
break;
default:
if (key.startsWith(CARBON_ENABLE_INDEX_SERVER) && key.split("\\.").length == 6) {
isValid = true;
} else if (key.startsWith(CarbonCommonConstants.CARBON_INPUT_SEGMENTS)) {
isValid = CarbonUtil.validateRangeOfSegmentList(value);
if (!isValid) {
throw new InvalidConfigurationException("Invalid CARBON_INPUT_SEGMENT_IDs");
}
} else if (key.equalsIgnoreCase(CarbonCommonConstants.SUPPORT_DIRECT_QUERY_ON_DATAMAP)) {
isValid = true;
} else if (key.startsWith(CarbonCommonConstants.CARBON_DATAMAP_VISIBLE)) {
isValid = true;
} else if (key.startsWith(CarbonCommonConstants.CARBON_LOAD_DATAMAPS_PARALLEL)) {
isValid = CarbonUtil.validateBoolean(value);
if (!isValid) {
throw new InvalidConfigurationException("Invalid value " + value + " for key " + key);
}
} else if (key.startsWith(CarbonLoadOptionConstants.CARBON_TABLE_LOAD_SORT_SCOPE)) {
isValid = CarbonUtil.isValidSortOption(value);
if (!isValid) {
throw new InvalidConfigurationException("The sort scope " + key
+ " can have only either NO_SORT, LOCAL_SORT or GLOBAL_SORT.");
}
} else {
throw new InvalidConfigurationException(
"The key " + key + " not supported for dynamic configuration.");
}
}
return isValid;
}
public void removeProperty(String property) {
sProps.remove(property);
}
public void removeExtraInfo(String key) {
extraInfo.remove(key);
}
/**
* clear the set properties
*/
public void clear() {
sProps.clear();
}
public SessionParams clone() throws CloneNotSupportedException {
super.clone();
SessionParams newObj = new SessionParams();
newObj.addedProps.putAll(this.addedProps);
newObj.sProps.putAll(this.sProps);
newObj.extraInfo.putAll(this.extraInfo);
return newObj;
}
}