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());
}
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);
}
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());
}
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;
}
Aggregations