package org.radargun.util;
import org.radargun.traits.Query;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Matej Cimbora
*/
public class QueryTraitRepository extends CoreTraitRepository {
public static Map<Class<?>, Object> getAllTraits() {
Map<Class<?>, Object> traitMap = new HashMap<>(CoreTraitRepository.getAllTraits());
ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap();
traitMap.put(org.radargun.traits.Queryable.class, new Queryable(concurrentHashMap));
traitMap.put(org.radargun.traits.ContinuousQuery.class, new ContinuousQuery());
return traitMap;
}
public static class Queryable implements org.radargun.traits.Queryable {
private ConcurrentHashMap cache;
public Queryable(ConcurrentHashMap cache) {
this.cache = cache;
}
@Override
public Query.Builder getBuilder(String containerName, Class<?> clazz) {
return new Builder(cache);
}
@Override
public Query.Context createContext(String containerName) {
return new Context();
}
@Override
public void reindex(String containerName) {
// no op
}
public Map getCache() {
return Collections.unmodifiableMap(cache);
}
public void setCache(ConcurrentHashMap cache) {
this.cache = cache;
}
private static class Builder implements org.radargun.traits.Query.Builder {
private ConcurrentHashMap cache;
public Builder(ConcurrentHashMap cache) {
this.cache = cache;
}
@Override
public Query.Builder subquery() {
return this;
}
@Override
public Query.Builder eq(org.radargun.traits.Query.SelectExpression selectExpression, Object value) {
return this;
}
@Override
public Query.Builder lt(org.radargun.traits.Query.SelectExpression selectExpression, Object value) {
return this;
}
@Override
public Query.Builder le(org.radargun.traits.Query.SelectExpression selectExpression, Object value) {
return this;
}
@Override
public Query.Builder gt(org.radargun.traits.Query.SelectExpression selectExpression, Object value) {
return this;
}
@Override
public Query.Builder ge(org.radargun.traits.Query.SelectExpression selectExpression, Object value) {
return this;
}
@Override
public Query.Builder between(org.radargun.traits.Query.SelectExpression selectExpression, Object lowerBound, boolean lowerInclusive, Object upperBound, boolean upperInclusive) {
return this;
}
@Override
public Query.Builder isNull(org.radargun.traits.Query.SelectExpression selectExpression) {
return this;
}
@Override
public Query.Builder like(org.radargun.traits.Query.SelectExpression selectExpression, String pattern) {
return this;
}
@Override
public Query.Builder contains(org.radargun.traits.Query.SelectExpression selectExpression, Object value) {
return this;
}
@Override
public Query.Builder not(Query.Builder subquery) {
return this;
}
@Override
public Query.Builder any(Query.Builder... subqueries) {
return this;
}
@Override
public Query.Builder orderBy(org.radargun.traits.Query.SelectExpression selectExpression) {
return this;
}
@Override
public Query.Builder projection(org.radargun.traits.Query.SelectExpression... selectExpressions) {
return this;
}
@Override
public Query.Builder groupBy(String[] attribute) {
return this;
}
@Override
public Query.Builder offset(long offset) {
return this;
}
@Override
public Query.Builder limit(long limit) {
return this;
}
@Override
public Query build() {
return new Query(cache);
}
}
private static class Query implements org.radargun.traits.Query {
private ConcurrentHashMap cache;
public Query(ConcurrentHashMap cache) {
this.cache = cache;
}
@Override
public Result execute(Context context) {
return new Queryable.Result(cache);
}
}
private static class Result implements org.radargun.traits.Query.Result {
private ConcurrentHashMap cache;
public Result(ConcurrentHashMap cache) {
this.cache = cache;
}
@Override
public int size() {
return cache.size();
}
@Override
public Collection values() {
return Collections.unmodifiableCollection(cache.values());
}
}
private static class Context implements org.radargun.traits.Query.Context {
@Override
public void close() {
// no op
}
}
}
public static class ContinuousQuery implements org.radargun.traits.ContinuousQuery {
private Map<String, Listener> cacheCqMap = new HashMap<>();
@Override
public ListenerReference createContinuousQuery(String cacheName, org.radargun.traits.Query query, Listener cqListener) {
cacheCqMap.put(cacheName, cqListener);
return new QueryTraitRepository.ListenerReference(cqListener);
}
@Override
public void removeContinuousQuery(String cacheName, ContinuousQuery.ListenerReference listenerReference) {
cacheCqMap.remove(cacheName, ((QueryTraitRepository.ListenerReference) listenerReference).listener);
}
public Map<String, Listener> getCacheCqMap() {
return Collections.unmodifiableMap(cacheCqMap);
}
}
private static class ListenerReference implements org.radargun.traits.ContinuousQuery.ListenerReference {
private final ContinuousQuery.Listener listener;
private ListenerReference(org.radargun.traits.ContinuousQuery.Listener listener) {
this.listener = listener;
}
}
}