blob: 2aafad433dae071fc5c6200f12580c0964cfaa39 [file] [log] [blame]
/**
*
*/
package org.eclipse.smila.solr.search;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.smila.datamodel.Any.ValueType;
import org.eclipse.smila.datamodel.Record;
import org.eclipse.smila.datamodel.util.MetadataUtils;
import org.eclipse.smila.datamodel.util.MetadataUtils.Mode;
import org.eclipse.smila.solr.SolrSchemaService;
import org.eclipse.smila.solr.SolrServiceException;
import org.eclipse.smila.solr.params.KeyValueParam;
import com.google.common.base.Splitter;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
/**
* @author pwissel
*
*/
public class FieldValueTypeCache {
private static final long EXPIRE_AFTER_MINUTES_DEFAULT = 60;
final SolrSchemaService _schemaService;
LoadingCache<String, ValueType> _cache = null;
final Splitter _splitter = Splitter.on("/");
public FieldValueTypeCache(final SolrSchemaService schemaService) {
this(schemaService, EXPIRE_AFTER_MINUTES_DEFAULT);
}
public FieldValueTypeCache(final SolrSchemaService schemaService, Long exprireAfterMinutes) {
_schemaService = schemaService;
exprireAfterMinutes = exprireAfterMinutes != null ? exprireAfterMinutes : EXPIRE_AFTER_MINUTES_DEFAULT;
// builder cache
_cache =
CacheBuilder.newBuilder().expireAfterWrite(exprireAfterMinutes, TimeUnit.MINUTES)
.build(new CacheLoader<String, ValueType>() {
@Override
public ValueType load(final String key) throws Exception {
return newValueType(key);
}
});
}
private ValueType newValueType(final String key) throws SolrServiceException {
final List<String> split = _splitter.splitToList(key);
final String type = getTypeFromSchema(split.get(0), split.get(1), split.get(2));
return getTypeAsValueType(type);
}
public ValueType get(final String client, final String index, final String field) throws ExecutionException {
final String key = getKey(client, index, field);
return _cache.get(key);
}
private String getKey(final String client, final String index, final String field) {
return new StringBuilder("#").append(client).append("/").append(index).append("/").append(field).toString();
}
private String getTypeFromSchema(final String client, final String index, final String field)
throws SolrServiceException {
final Record fieldInfo =
_schemaService.getField(client, index, field, new KeyValueParam("includeDynamic", true));
return MetadataUtils.getValue(fieldInfo.getMetadata(), Mode.FAIL, "fields", "1", "type").asString();
}
private static final String[] LONGS = { "int", "short", "long" };
private static final String[] DOUBLES = { "float", "double" };
private static final String[] DATES = { "date" };
private static final String[] BOOLEANS = { "boolean" };
private ValueType getTypeAsValueType(final String type) {
if (ArrayUtils.contains(LONGS, type)) {
return ValueType.LONG;
} else if (ArrayUtils.contains(DOUBLES, type)) {
return ValueType.DOUBLE;
} else if (ArrayUtils.contains(DATES, type)) {
return ValueType.DATETIME;
} else if (ArrayUtils.contains(BOOLEANS, type)) {
return ValueType.BOOLEAN;
}
return ValueType.STRING;
}
}