Search in sources :

Example 1 with RangeConditions

use of com.baidu.hugegraph.backend.query.Condition.RangeConditions in project incubator-hugegraph by apache.

the class TextSerializer method writeQueryEdgeRangeCondition.

private Query writeQueryEdgeRangeCondition(ConditionQuery cq) {
    List<Condition> sortValues = cq.syspropConditions(HugeKeys.SORT_VALUES);
    E.checkArgument(sortValues.size() >= 1 && sortValues.size() <= 2, "Edge range query must be with sort-values range");
    // Would ignore target vertex
    Object vertex = cq.condition(HugeKeys.OWNER_VERTEX);
    Object direction = cq.condition(HugeKeys.DIRECTION);
    if (direction == null) {
        direction = Directions.OUT;
    }
    Object label = cq.condition(HugeKeys.LABEL);
    List<String> start = new ArrayList<>(cq.conditionsSize());
    start.add(writeEntryId((Id) vertex));
    start.add(writeType(((Directions) direction).type()));
    start.add(writeId((Id) label));
    List<String> end = new ArrayList<>(start);
    RangeConditions range = new RangeConditions(sortValues);
    if (range.keyMin() != null) {
        start.add((String) range.keyMin());
    }
    if (range.keyMax() != null) {
        end.add((String) range.keyMax());
    }
    // Sort-value will be empty if there is no start sort-value
    String startId = EdgeId.concat(start.toArray(new String[0]));
    // Set endId as prefix if there is no end sort-value
    String endId = EdgeId.concat(end.toArray(new String[0]));
    if (range.keyMax() == null) {
        return new IdPrefixQuery(cq, IdGenerator.of(startId), range.keyMinEq(), IdGenerator.of(endId));
    }
    return new IdRangeQuery(cq, IdGenerator.of(startId), range.keyMinEq(), IdGenerator.of(endId), range.keyMaxEq());
}
Also used : Condition(com.baidu.hugegraph.backend.query.Condition) Directions(com.baidu.hugegraph.type.define.Directions) ArrayList(java.util.ArrayList) Id(com.baidu.hugegraph.backend.id.Id) EdgeId(com.baidu.hugegraph.backend.id.EdgeId) RangeConditions(com.baidu.hugegraph.backend.query.Condition.RangeConditions) IdRangeQuery(com.baidu.hugegraph.backend.query.IdRangeQuery) IdPrefixQuery(com.baidu.hugegraph.backend.query.IdPrefixQuery)

Example 2 with RangeConditions

use of com.baidu.hugegraph.backend.query.Condition.RangeConditions in project incubator-hugegraph by apache.

the class BinarySerializer method writeRangeIndexQuery.

private Query writeRangeIndexQuery(ConditionQuery query) {
    Id index = query.condition(HugeKeys.INDEX_LABEL_ID);
    E.checkArgument(index != null, "Please specify the index label");
    List<Condition> fields = query.syspropConditions(HugeKeys.FIELD_VALUES);
    E.checkArgument(!fields.isEmpty(), "Please specify the index field values");
    HugeType type = query.resultType();
    Id start = null;
    if (query.paging() && !query.page().isEmpty()) {
        byte[] position = PageState.fromString(query.page()).position();
        start = new BinaryId(position, null);
    }
    RangeConditions range = new RangeConditions(fields);
    if (range.keyEq() != null) {
        Id id = formatIndexId(type, index, range.keyEq(), true);
        if (start == null) {
            return new IdPrefixQuery(query, id);
        }
        E.checkArgument(Bytes.compare(start.asBytes(), id.asBytes()) >= 0, "Invalid page out of lower bound");
        return new IdPrefixQuery(query, start, id);
    }
    Object keyMin = range.keyMin();
    Object keyMax = range.keyMax();
    boolean keyMinEq = range.keyMinEq();
    boolean keyMaxEq = range.keyMaxEq();
    if (keyMin == null) {
        E.checkArgument(keyMax != null, "Please specify at least one condition");
        // Set keyMin to min value
        keyMin = NumericUtil.minValueOf(keyMax.getClass());
        keyMinEq = true;
    }
    Id min = formatIndexId(type, index, keyMin, false);
    if (!keyMinEq) {
        /*
             * Increase 1 to keyMin, index GT query is a scan with GT prefix,
             * inclusiveStart=false will also match index started with keyMin
             */
        increaseOne(min.asBytes());
        keyMinEq = true;
    }
    if (start == null) {
        start = min;
    } else {
        E.checkArgument(Bytes.compare(start.asBytes(), min.asBytes()) >= 0, "Invalid page out of lower bound");
    }
    if (keyMax == null) {
        keyMax = NumericUtil.maxValueOf(keyMin.getClass());
        keyMaxEq = true;
    }
    Id max = formatIndexId(type, index, keyMax, false);
    if (keyMaxEq) {
        keyMaxEq = false;
        increaseOne(max.asBytes());
    }
    return new IdRangeQuery(query, start, keyMinEq, max, keyMaxEq);
}
Also used : Condition(com.baidu.hugegraph.backend.query.Condition) BinaryId(com.baidu.hugegraph.backend.serializer.BinaryBackendEntry.BinaryId) BinaryId(com.baidu.hugegraph.backend.serializer.BinaryBackendEntry.BinaryId) Id(com.baidu.hugegraph.backend.id.Id) EdgeId(com.baidu.hugegraph.backend.id.EdgeId) HugeType(com.baidu.hugegraph.type.HugeType) RangeConditions(com.baidu.hugegraph.backend.query.Condition.RangeConditions) IdRangeQuery(com.baidu.hugegraph.backend.query.IdRangeQuery) IdPrefixQuery(com.baidu.hugegraph.backend.query.IdPrefixQuery)

Example 3 with RangeConditions

use of com.baidu.hugegraph.backend.query.Condition.RangeConditions in project incubator-hugegraph by apache.

the class BinarySerializer method writeQueryEdgeRangeCondition.

private Query writeQueryEdgeRangeCondition(ConditionQuery cq) {
    List<Condition> sortValues = cq.syspropConditions(HugeKeys.SORT_VALUES);
    E.checkArgument(sortValues.size() >= 1 && sortValues.size() <= 2, "Edge range query must be with sort-values range");
    // Would ignore target vertex
    Id vertex = cq.condition(HugeKeys.OWNER_VERTEX);
    Directions direction = cq.condition(HugeKeys.DIRECTION);
    if (direction == null) {
        direction = Directions.OUT;
    }
    Id label = cq.condition(HugeKeys.LABEL);
    BytesBuffer start = BytesBuffer.allocate(BytesBuffer.BUF_EDGE_ID);
    writePartitionedId(HugeType.EDGE, vertex, start);
    start.write(direction.type().code());
    start.writeId(label);
    BytesBuffer end = BytesBuffer.allocate(BytesBuffer.BUF_EDGE_ID);
    end.copyFrom(start);
    RangeConditions range = new RangeConditions(sortValues);
    if (range.keyMin() != null) {
        start.writeStringRaw((String) range.keyMin());
    }
    if (range.keyMax() != null) {
        end.writeStringRaw((String) range.keyMax());
    }
    // Sort-value will be empty if there is no start sort-value
    Id startId = new BinaryId(start.bytes(), null);
    // Set endId as prefix if there is no end sort-value
    Id endId = new BinaryId(end.bytes(), null);
    boolean includeStart = range.keyMinEq();
    if (cq.paging() && !cq.page().isEmpty()) {
        includeStart = true;
        byte[] position = PageState.fromString(cq.page()).position();
        E.checkArgument(Bytes.compare(position, startId.asBytes()) >= 0, "Invalid page out of lower bound");
        startId = new BinaryId(position, null);
    }
    if (range.keyMax() == null) {
        return new IdPrefixQuery(cq, startId, includeStart, endId);
    }
    return new IdRangeQuery(cq, startId, includeStart, endId, range.keyMaxEq());
}
Also used : Condition(com.baidu.hugegraph.backend.query.Condition) BinaryId(com.baidu.hugegraph.backend.serializer.BinaryBackendEntry.BinaryId) Directions(com.baidu.hugegraph.type.define.Directions) BinaryId(com.baidu.hugegraph.backend.serializer.BinaryBackendEntry.BinaryId) Id(com.baidu.hugegraph.backend.id.Id) EdgeId(com.baidu.hugegraph.backend.id.EdgeId) RangeConditions(com.baidu.hugegraph.backend.query.Condition.RangeConditions) IdRangeQuery(com.baidu.hugegraph.backend.query.IdRangeQuery) IdPrefixQuery(com.baidu.hugegraph.backend.query.IdPrefixQuery)

Example 4 with RangeConditions

use of com.baidu.hugegraph.backend.query.Condition.RangeConditions in project incubator-hugegraph by apache.

the class GraphIndexTransaction method constructShardConditions.

protected static List<Condition> constructShardConditions(ConditionQuery query, List<Id> fields, HugeKeys key) {
    List<Condition> conditions = new ArrayList<>(2);
    boolean hasRange = false;
    int processedCondCount = 0;
    List<Object> prefixes = new ArrayList<>();
    for (Id field : fields) {
        List<Condition> fieldConds = query.userpropConditions(field);
        processedCondCount += fieldConds.size();
        if (fieldConds.isEmpty()) {
            break;
        }
        RangeConditions range = new RangeConditions(fieldConds);
        if (!range.hasRange()) {
            E.checkArgument(range.keyEq() != null, "Invalid query: %s", query);
            prefixes.add(range.keyEq());
            continue;
        }
        if (range.keyMin() != null) {
            RelationType type = range.keyMinEq() ? RelationType.GTE : RelationType.GT;
            conditions.add(shardFieldValuesCondition(key, prefixes, range.keyMin(), type));
        } else {
            assert range.keyMax() != null;
            Object num = range.keyMax();
            num = NumericUtil.minValueOf(NumericUtil.isNumber(num) ? num.getClass() : Long.class);
            conditions.add(shardFieldValuesCondition(key, prefixes, num, RelationType.GTE));
        }
        if (range.keyMax() != null) {
            RelationType type = range.keyMaxEq() ? RelationType.LTE : RelationType.LT;
            conditions.add(shardFieldValuesCondition(key, prefixes, range.keyMax(), type));
        } else {
            Object num = range.keyMin();
            num = NumericUtil.maxValueOf(NumericUtil.isNumber(num) ? num.getClass() : Long.class);
            conditions.add(shardFieldValuesCondition(key, prefixes, num, RelationType.LTE));
        }
        hasRange = true;
        break;
    }
    /*
         * Can't have conditions after range condition for shard index,
         * but SORT_KEYS can have redundant conditions because upper
         * layer can do filter.
         */
    if (key == HugeKeys.FIELD_VALUES && processedCondCount < query.userpropKeys().size()) {
        throw new HugeException("Invalid shard index query: %s", query);
    }
    // 1. First range condition processed, finish shard query conditions
    if (hasRange) {
        return conditions;
    }
    // 2. Shard query without range
    String joinedValues;
    // 2.1 All fields have equal-conditions
    if (prefixes.size() == fields.size()) {
        // Prefix numeric values should be converted to sortable string
        joinedValues = ConditionQuery.concatValues(prefixes);
        conditions.add(Condition.eq(key, joinedValues));
        return conditions;
    }
    // 2.2 Prefix fields have equal-conditions
    /*
         * Append EMPTY to 'values' to ensure FIELD_VALUES suffix
         * with IdGenerator.NAME_SPLITOR
         */
    prefixes.add(ConditionQuery.INDEX_VALUE_EMPTY);
    joinedValues = ConditionQuery.concatValues(prefixes);
    Condition min = Condition.gte(key, joinedValues);
    conditions.add(min);
    // Increase 1 on prefix to get the next prefix
    Condition max = Condition.lt(key, increaseString(joinedValues));
    conditions.add(max);
    return conditions;
}
Also used : Condition(com.baidu.hugegraph.backend.query.Condition) RelationType(com.baidu.hugegraph.backend.query.Condition.RelationType) ArrayList(java.util.ArrayList) Id(com.baidu.hugegraph.backend.id.Id) RangeConditions(com.baidu.hugegraph.backend.query.Condition.RangeConditions) HugeException(com.baidu.hugegraph.HugeException)

Aggregations

Id (com.baidu.hugegraph.backend.id.Id)4 Condition (com.baidu.hugegraph.backend.query.Condition)4 RangeConditions (com.baidu.hugegraph.backend.query.Condition.RangeConditions)4 EdgeId (com.baidu.hugegraph.backend.id.EdgeId)3 IdPrefixQuery (com.baidu.hugegraph.backend.query.IdPrefixQuery)3 IdRangeQuery (com.baidu.hugegraph.backend.query.IdRangeQuery)3 BinaryId (com.baidu.hugegraph.backend.serializer.BinaryBackendEntry.BinaryId)2 Directions (com.baidu.hugegraph.type.define.Directions)2 ArrayList (java.util.ArrayList)2 HugeException (com.baidu.hugegraph.HugeException)1 RelationType (com.baidu.hugegraph.backend.query.Condition.RelationType)1 HugeType (com.baidu.hugegraph.type.HugeType)1