blob: 2b5ab7c5281b5e0b8a275ba1e8c27c93df461fe9 [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.cassandra.schema;
import java.util.HashMap;
import java.util.Map;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.cassandra.exceptions.ConfigurationException;
import static java.lang.String.format;
// CQL: {'keys' : 'ALL'|'NONE', 'rows_per_partition': '200'|'NONE'|'ALL'}
public final class CachingParams
{
public enum Option
{
KEYS,
ROWS_PER_PARTITION;
@Override
public String toString()
{
return name().toLowerCase();
}
}
private static final String ALL = "ALL";
private static final String NONE = "NONE";
static final boolean DEFAULT_CACHE_KEYS = true;
static final int DEFAULT_ROWS_PER_PARTITION_TO_CACHE = 0;
public static final CachingParams CACHE_NOTHING = new CachingParams(false, 0);
public static final CachingParams CACHE_KEYS = new CachingParams(true, 0);
public static final CachingParams CACHE_EVERYTHING = new CachingParams(true, Integer.MAX_VALUE);
static final CachingParams DEFAULT = new CachingParams(DEFAULT_CACHE_KEYS, DEFAULT_ROWS_PER_PARTITION_TO_CACHE);
final boolean cacheKeys;
final int rowsPerPartitionToCache;
public CachingParams(boolean cacheKeys, int rowsPerPartitionToCache)
{
this.cacheKeys = cacheKeys;
this.rowsPerPartitionToCache = rowsPerPartitionToCache;
}
public boolean cacheKeys()
{
return cacheKeys;
}
public boolean cacheRows()
{
return rowsPerPartitionToCache > 0;
}
public boolean cacheAllRows()
{
return rowsPerPartitionToCache == Integer.MAX_VALUE;
}
public int rowsPerPartitionToCache()
{
return rowsPerPartitionToCache;
}
public static CachingParams fromMap(Map<String, String> map)
{
Map<String, String> copy = new HashMap<>(map);
String keys = copy.remove(Option.KEYS.toString());
boolean cacheKeys = keys != null && keysFromString(keys);
String rows = copy.remove(Option.ROWS_PER_PARTITION.toString());
int rowsPerPartitionToCache = rows == null
? 0
: rowsPerPartitionFromString(rows);
if (!copy.isEmpty())
{
throw new ConfigurationException(format("Invalid caching sub-options %s: only '%s' and '%s' are allowed",
copy.keySet(),
Option.KEYS,
Option.ROWS_PER_PARTITION));
}
return new CachingParams(cacheKeys, rowsPerPartitionToCache);
}
public Map<String, String> asMap()
{
return ImmutableMap.of(Option.KEYS.toString(),
keysAsString(),
Option.ROWS_PER_PARTITION.toString(),
rowsPerPartitionAsString());
}
private static boolean keysFromString(String value)
{
if (value.equalsIgnoreCase(ALL))
return true;
if (value.equalsIgnoreCase(NONE))
return false;
throw new ConfigurationException(format("Invalid value '%s' for caching sub-option '%s': only '%s' and '%s' are allowed",
value,
Option.KEYS,
ALL,
NONE));
}
String keysAsString()
{
return cacheKeys ? ALL : NONE;
}
private static int rowsPerPartitionFromString(String value)
{
if (value.equalsIgnoreCase(ALL))
return Integer.MAX_VALUE;
if (value.equalsIgnoreCase(NONE))
return 0;
if (StringUtils.isNumeric(value))
return Integer.parseInt(value);
throw new ConfigurationException(format("Invalid value '%s' for caching sub-option '%s':"
+ " only '%s', '%s', and integer values are allowed",
value,
Option.ROWS_PER_PARTITION,
ALL,
NONE));
}
String rowsPerPartitionAsString()
{
if (rowsPerPartitionToCache == 0)
return NONE;
else if (rowsPerPartitionToCache == Integer.MAX_VALUE)
return ALL;
else
return Integer.toString(rowsPerPartitionToCache);
}
@Override
public String toString()
{
return format("{'%s' : '%s', '%s' : '%s'}",
Option.KEYS,
keysAsString(),
Option.ROWS_PER_PARTITION,
rowsPerPartitionAsString());
}
@Override
public boolean equals(Object o)
{
if (this == o)
return true;
if (!(o instanceof CachingParams))
return false;
CachingParams c = (CachingParams) o;
return cacheKeys == c.cacheKeys && rowsPerPartitionToCache == c.rowsPerPartitionToCache;
}
@Override
public int hashCode()
{
return Objects.hashCode(cacheKeys, rowsPerPartitionToCache);
}
}