Search in sources :

Example 1 with RedissonSetMultimap

use of org.redisson.RedissonSetMultimap in project redisson by redisson.

the class LiveObjectSearch method traverseOr.

private Set<Object> traverseOr(ORCondition condition, NamingScheme namingScheme, Class<?> entityClass) {
    Set<Object> allIds = new HashSet<Object>();
    List<String> eqNames = new ArrayList<String>();
    Map<RScoredSortedSet<Object>, Number> ltNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> leNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> gtNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> geNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> eqNumericNames = new HashMap<>();
    for (Condition cond : condition.getConditions()) {
        if (cond instanceof EQCondition) {
            EQCondition eqc = (EQCondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, eqc.getName());
            if (eqc.getValue() instanceof Number) {
                RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
                eqNumericNames.put(values, (Number) eqc.getValue());
            } else {
                RSetMultimap<Object, Object> map = new RedissonSetMultimap<>(namingScheme.getCodec(), commandExecutor, indexName);
                RSet<Object> values = map.get(eqc.getValue());
                eqNames.add(((RedissonObject) values).getRawName());
            }
        }
        if (cond instanceof GTCondition) {
            GTCondition gtc = (GTCondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, gtc.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            gtNumericNames.put(values, gtc.getValue());
        }
        if (cond instanceof GECondition) {
            GECondition gec = (GECondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, gec.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            geNumericNames.put(values, gec.getValue());
        }
        if (cond instanceof LTCondition) {
            LTCondition ltc = (LTCondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, ltc.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            ltNumericNames.put(values, ltc.getValue());
        }
        if (cond instanceof LECondition) {
            LECondition lec = (LECondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, lec.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            leNumericNames.put(values, lec.getValue());
        }
        if (cond instanceof ANDCondition) {
            Collection<Object> ids = traverseAnd((ANDCondition) cond, namingScheme, entityClass);
            allIds.addAll(ids);
        }
    }
    if (!eqNames.isEmpty()) {
        RSet<Object> set = new RedissonSet<>(commandExecutor, eqNames.get(0), null);
        allIds.addAll(set.readUnion(eqNames.toArray(new String[eqNames.size()])));
    }
    for (Entry<RScoredSortedSet<Object>, Number> e : eqNumericNames.entrySet()) {
        Collection<Object> ids = e.getKey().valueRange(e.getValue().doubleValue(), true, e.getValue().doubleValue(), true);
        allIds.addAll(ids);
    }
    for (Entry<RScoredSortedSet<Object>, Number> e : gtNumericNames.entrySet()) {
        Collection<Object> ids = e.getKey().valueRange(e.getValue().doubleValue(), false, Double.POSITIVE_INFINITY, false);
        allIds.addAll(ids);
    }
    for (Entry<RScoredSortedSet<Object>, Number> e : geNumericNames.entrySet()) {
        Collection<Object> ids = e.getKey().valueRange(e.getValue().doubleValue(), true, Double.POSITIVE_INFINITY, false);
        allIds.addAll(ids);
    }
    for (Entry<RScoredSortedSet<Object>, Number> e : ltNumericNames.entrySet()) {
        Collection<Object> ids = e.getKey().valueRange(Double.NEGATIVE_INFINITY, false, e.getValue().doubleValue(), false);
        allIds.addAll(ids);
    }
    for (Entry<RScoredSortedSet<Object>, Number> e : leNumericNames.entrySet()) {
        Collection<Object> ids = e.getKey().valueRange(Double.NEGATIVE_INFINITY, false, e.getValue().doubleValue(), true);
        allIds.addAll(ids);
    }
    return allIds;
}
Also used : RedissonSet(org.redisson.RedissonSet) RScoredSortedSet(org.redisson.api.RScoredSortedSet) Condition(org.redisson.api.condition.Condition) RedissonScoredSortedSet(org.redisson.RedissonScoredSortedSet) RedissonSetMultimap(org.redisson.RedissonSetMultimap) RedissonObject(org.redisson.RedissonObject)

Example 2 with RedissonSetMultimap

use of org.redisson.RedissonSetMultimap in project redisson by redisson.

the class LiveObjectSearch method find.

public Set<Object> find(Class<?> entityClass, Condition condition) {
    NamingScheme namingScheme = commandExecutor.getObjectBuilder().getNamingScheme(entityClass);
    if (condition instanceof EQCondition) {
        EQCondition c = (EQCondition) condition;
        String indexName = namingScheme.getIndexName(entityClass, c.getName());
        if (c.getValue() instanceof Number) {
            RScoredSortedSet<Object> set = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            double v = ((Number) c.getValue()).doubleValue();
            Collection<Object> gtIds = set.valueRange(v, true, v, true);
            return new HashSet<>(gtIds);
        } else {
            RSetMultimap<Object, Object> map = new RedissonSetMultimap<>(namingScheme.getCodec(), commandExecutor, indexName);
            return map.getAll(c.getValue());
        }
    } else if (condition instanceof GTCondition) {
        GTCondition c = (GTCondition) condition;
        String indexName = namingScheme.getIndexName(entityClass, c.getName());
        RScoredSortedSet<Object> set = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
        Collection<Object> gtIds = set.valueRange(c.getValue().doubleValue(), false, Double.POSITIVE_INFINITY, false);
        return new HashSet<>(gtIds);
    } else if (condition instanceof GECondition) {
        GECondition c = (GECondition) condition;
        String indexName = namingScheme.getIndexName(entityClass, c.getName());
        RScoredSortedSet<Object> set = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
        Collection<Object> gtIds = set.valueRange(c.getValue().doubleValue(), true, Double.POSITIVE_INFINITY, false);
        return new HashSet<>(gtIds);
    } else if (condition instanceof LTCondition) {
        LTCondition c = (LTCondition) condition;
        String indexName = namingScheme.getIndexName(entityClass, c.getName());
        RScoredSortedSet<Object> set = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
        Collection<Object> gtIds = set.valueRange(Double.NEGATIVE_INFINITY, false, c.getValue().doubleValue(), false);
        return new HashSet<>(gtIds);
    } else if (condition instanceof LECondition) {
        LECondition c = (LECondition) condition;
        String indexName = namingScheme.getIndexName(entityClass, c.getName());
        RScoredSortedSet<Object> set = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
        Collection<Object> gtIds = set.valueRange(Double.NEGATIVE_INFINITY, false, c.getValue().doubleValue(), true);
        return new HashSet<>(gtIds);
    } else if (condition instanceof ORCondition) {
        return traverseOr((ORCondition) condition, namingScheme, entityClass);
    } else if (condition instanceof ANDCondition) {
        return traverseAnd((ANDCondition) condition, namingScheme, entityClass);
    }
    throw new IllegalArgumentException();
}
Also used : RScoredSortedSet(org.redisson.api.RScoredSortedSet) NamingScheme(org.redisson.liveobject.resolver.NamingScheme) RedissonScoredSortedSet(org.redisson.RedissonScoredSortedSet) RedissonSetMultimap(org.redisson.RedissonSetMultimap) RedissonObject(org.redisson.RedissonObject)

Example 3 with RedissonSetMultimap

use of org.redisson.RedissonSetMultimap in project redisson by redisson.

the class AccessorInterceptor method removeIndex.

private void removeIndex(RMap<String, Object> liveMap, Object me, Field field) {
    if (field.getAnnotation(RIndex.class) == null) {
        return;
    }
    NamingScheme namingScheme = commandExecutor.getObjectBuilder().getNamingScheme(me.getClass().getSuperclass());
    String indexName = namingScheme.getIndexName(me.getClass().getSuperclass(), field.getName());
    CommandBatchService ce;
    if (commandExecutor instanceof CommandBatchService) {
        ce = (CommandBatchService) commandExecutor;
    } else {
        ce = new CommandBatchService(commandExecutor);
    }
    if (Number.class.isAssignableFrom(field.getType()) || PRIMITIVE_CLASSES.contains(field.getType())) {
        RScoredSortedSetAsync<Object> set = new RedissonScoredSortedSet<>(namingScheme.getCodec(), ce, indexName, null);
        set.removeAsync(((RLiveObject) me).getLiveObjectId());
    } else {
        if (ClassUtils.isAnnotationPresent(field.getType(), REntity.class) || commandExecutor.getConnectionManager().isClusterMode()) {
            Object value = liveMap.remove(field.getName());
            if (value != null) {
                RMultimapAsync<Object, Object> map = new RedissonSetMultimap<>(namingScheme.getCodec(), ce, indexName);
                Object k = value;
                if (ClassUtils.isAnnotationPresent(field.getType(), REntity.class)) {
                    k = ((RLiveObject) value).getLiveObjectId();
                }
                map.removeAsync(k, ((RLiveObject) me).getLiveObjectId());
            }
        } else {
            removeAsync(ce, indexName, ((RedissonObject) liveMap).getRawName(), namingScheme.getCodec(), ((RLiveObject) me).getLiveObjectId(), field.getName());
        }
    }
    if (ce != commandExecutor) {
        ce.execute();
    }
}
Also used : RedissonSetMultimap(org.redisson.RedissonSetMultimap) REntity(org.redisson.api.annotation.REntity) RIndex(org.redisson.api.annotation.RIndex) NamingScheme(org.redisson.liveobject.resolver.NamingScheme) CommandBatchService(org.redisson.command.CommandBatchService) RedissonScoredSortedSet(org.redisson.RedissonScoredSortedSet) RedissonObject(org.redisson.RedissonObject)

Example 4 with RedissonSetMultimap

use of org.redisson.RedissonSetMultimap in project redisson by redisson.

the class AccessorInterceptor method storeIndex.

private void storeIndex(Field field, Object me, Object arg) {
    if (field.getAnnotation(RIndex.class) == null) {
        return;
    }
    NamingScheme namingScheme = commandExecutor.getObjectBuilder().getNamingScheme(me.getClass().getSuperclass());
    String indexName = namingScheme.getIndexName(me.getClass().getSuperclass(), field.getName());
    boolean skipExecution = false;
    CommandBatchService ce;
    if (commandExecutor instanceof CommandBatchService) {
        ce = (CommandBatchService) commandExecutor;
        skipExecution = true;
    } else {
        ce = new CommandBatchService(commandExecutor);
    }
    if (arg instanceof Number) {
        RScoredSortedSetAsync<Object> set = new RedissonScoredSortedSet<>(namingScheme.getCodec(), ce, indexName, null);
        set.addAsync(((Number) arg).doubleValue(), ((RLiveObject) me).getLiveObjectId());
    } else {
        RMultimapAsync<Object, Object> map = new RedissonSetMultimap<>(namingScheme.getCodec(), ce, indexName);
        map.putAsync(arg, ((RLiveObject) me).getLiveObjectId());
    }
    if (!skipExecution) {
        ce.execute();
    }
}
Also used : RedissonSetMultimap(org.redisson.RedissonSetMultimap) RIndex(org.redisson.api.annotation.RIndex) NamingScheme(org.redisson.liveobject.resolver.NamingScheme) CommandBatchService(org.redisson.command.CommandBatchService) RedissonScoredSortedSet(org.redisson.RedissonScoredSortedSet) RedissonObject(org.redisson.RedissonObject)

Example 5 with RedissonSetMultimap

use of org.redisson.RedissonSetMultimap in project redisson by redisson.

the class LiveObjectSearch method traverseAnd.

private Set<Object> traverseAnd(ANDCondition condition, NamingScheme namingScheme, Class<?> entityClass) {
    Set<Object> allIds = new HashSet<Object>();
    List<String> eqNames = new ArrayList<String>();
    Map<RScoredSortedSet<Object>, Number> gtNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> geNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> ltNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> leNumericNames = new HashMap<>();
    Map<RScoredSortedSet<Object>, Number> eqNumericNames = new HashMap<>();
    for (Condition cond : condition.getConditions()) {
        if (cond instanceof EQCondition) {
            EQCondition eqc = (EQCondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, eqc.getName());
            if (eqc.getValue() instanceof Number) {
                RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
                eqNumericNames.put(values, (Number) eqc.getValue());
            } else {
                RSetMultimap<Object, Object> map = new RedissonSetMultimap<>(namingScheme.getCodec(), commandExecutor, indexName);
                RSet<Object> values = map.get(eqc.getValue());
                eqNames.add(((RedissonObject) values).getRawName());
            }
        }
        if (cond instanceof LTCondition) {
            LTCondition ltc = (LTCondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, ltc.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            ltNumericNames.put(values, ltc.getValue());
        }
        if (cond instanceof LECondition) {
            LECondition lec = (LECondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, lec.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            leNumericNames.put(values, lec.getValue());
        }
        if (cond instanceof GECondition) {
            GECondition gec = (GECondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, gec.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            geNumericNames.put(values, gec.getValue());
        }
        if (cond instanceof GTCondition) {
            GTCondition gtc = (GTCondition) cond;
            String indexName = namingScheme.getIndexName(entityClass, gtc.getName());
            RScoredSortedSet<Object> values = new RedissonScoredSortedSet<>(namingScheme.getCodec(), commandExecutor, indexName, null);
            gtNumericNames.put(values, gtc.getValue());
        }
        if (cond instanceof ORCondition) {
            Collection<Object> ids = traverseOr((ORCondition) cond, namingScheme, entityClass);
            if (ids.isEmpty()) {
                return Collections.emptySet();
            }
            if (!allIds.isEmpty()) {
                allIds.retainAll(ids);
            } else {
                allIds.addAll(ids);
            }
            if (allIds.isEmpty()) {
                return Collections.emptySet();
            }
        }
    }
    if (!eqNames.isEmpty()) {
        RSet<Object> set = new RedissonSet<>(commandExecutor, eqNames.get(0), null);
        Set<Object> intersect = set.readIntersection(eqNames.toArray(new String[eqNames.size()]));
        if (!allIds.isEmpty()) {
            allIds.retainAll(intersect);
            if (allIds.isEmpty()) {
                return Collections.emptySet();
            }
        } else {
            allIds.addAll(intersect);
        }
        if (allIds.isEmpty()) {
            return allIds;
        }
    }
    if (!checkValueRange(allIds, eqNumericNames, (r, v) -> {
        return r.valueRange(v.doubleValue(), true, v.doubleValue(), true);
    })) {
        return Collections.emptySet();
    }
    if (!checkValueRange(allIds, gtNumericNames, (r, v) -> {
        return r.valueRange(v.doubleValue(), false, Double.POSITIVE_INFINITY, false);
    })) {
        return Collections.emptySet();
    }
    if (!checkValueRange(allIds, geNumericNames, (r, v) -> {
        return r.valueRange(v.doubleValue(), true, Double.POSITIVE_INFINITY, false);
    })) {
        return Collections.emptySet();
    }
    if (!checkValueRange(allIds, ltNumericNames, (r, v) -> {
        return r.valueRange(Double.NEGATIVE_INFINITY, false, v.doubleValue(), false);
    })) {
        return Collections.emptySet();
    }
    if (!checkValueRange(allIds, leNumericNames, (r, v) -> {
        return r.valueRange(Double.NEGATIVE_INFINITY, false, v.doubleValue(), true);
    })) {
        return Collections.emptySet();
    }
    return allIds;
}
Also used : RedissonSet(org.redisson.RedissonSet) RedissonScoredSortedSet(org.redisson.RedissonScoredSortedSet) RScoredSortedSet(org.redisson.api.RScoredSortedSet) CommandAsyncExecutor(org.redisson.command.CommandAsyncExecutor) java.util(java.util) BiFunction(java.util.function.BiFunction) RSet(org.redisson.api.RSet) RSetMultimap(org.redisson.api.RSetMultimap) org.redisson.liveobject.condition(org.redisson.liveobject.condition) Condition(org.redisson.api.condition.Condition) RedissonSetMultimap(org.redisson.RedissonSetMultimap) RedissonObject(org.redisson.RedissonObject) Entry(java.util.Map.Entry) NamingScheme(org.redisson.liveobject.resolver.NamingScheme) RedissonSet(org.redisson.RedissonSet) RScoredSortedSet(org.redisson.api.RScoredSortedSet) Condition(org.redisson.api.condition.Condition) RedissonScoredSortedSet(org.redisson.RedissonScoredSortedSet) RedissonSetMultimap(org.redisson.RedissonSetMultimap) RedissonObject(org.redisson.RedissonObject)

Aggregations

RedissonObject (org.redisson.RedissonObject)5 RedissonScoredSortedSet (org.redisson.RedissonScoredSortedSet)5 RedissonSetMultimap (org.redisson.RedissonSetMultimap)5 NamingScheme (org.redisson.liveobject.resolver.NamingScheme)4 RScoredSortedSet (org.redisson.api.RScoredSortedSet)3 RedissonSet (org.redisson.RedissonSet)2 RIndex (org.redisson.api.annotation.RIndex)2 Condition (org.redisson.api.condition.Condition)2 CommandBatchService (org.redisson.command.CommandBatchService)2 java.util (java.util)1 Entry (java.util.Map.Entry)1 BiFunction (java.util.function.BiFunction)1 RSet (org.redisson.api.RSet)1 RSetMultimap (org.redisson.api.RSetMultimap)1 REntity (org.redisson.api.annotation.REntity)1 CommandAsyncExecutor (org.redisson.command.CommandAsyncExecutor)1 org.redisson.liveobject.condition (org.redisson.liveobject.condition)1