use of com.baidu.hugegraph.backend.store.Shard in project incubator-hugegraph by apache.
the class HbaseTable method queryByCond.
protected <R> R queryByCond(HbaseSession<R> session, ConditionQuery query) {
if (query.containsScanRelation()) {
E.checkArgument(query.relations().size() == 1, "Invalid scan with multi conditions: %s", query);
Relation scan = query.relations().iterator().next();
Shard shard = (Shard) scan.value();
return this.queryByRange(session, shard, query.page());
}
throw new NotSupportException("query: %s", query);
}
use of com.baidu.hugegraph.backend.store.Shard in project incubator-hugegraph by apache.
the class CassandraShard method getSplits.
/**
* Get splits of a table in specified range
* NOTE: maybe we don't need this method
* @param start: the start of range
* @param end: the end of range
* @param splitPartitions: expected partitions count per split
* @param splitSize: expected size(bytes) per split,
* splitPartitions will be ignored if splitSize is passed
* @return a list of Shard
*/
public List<Shard> getSplits(String start, String end, int splitPartitions, int splitSize) {
ExecutorService executor = new ThreadPoolExecutor(0, 128, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
List<Shard> splits = new ArrayList<>();
try {
List<Future<List<Shard>>> futures = new ArrayList<>();
TokenFactory tokenFactory = this.partitioner.getTokenFactory();
TokenRange tokenRange = rangeToTokenRange(new Range<>(tokenFactory.fromString(start), tokenFactory.fromString(end)));
// Canonical ranges and nodes holding replicas
Map<TokenRange, Set<Host>> masterRangeNodes = getRangeMap();
for (TokenRange range : masterRangeNodes.keySet()) {
for (TokenRange r : range.intersectWith(tokenRange)) {
// For each tokenRange, pick a live owner and ask it
// to compute bite-sized splits
futures.add(executor.submit(new SplitCallable(r, splitPartitions, splitSize)));
}
}
// Wait until we have all the results back
for (Future<List<Shard>> future : futures) {
try {
splits.addAll(future.get());
} catch (Exception e) {
throw new BackendException("Can't get cassandra shards", e);
}
}
assert splits.size() >= masterRangeNodes.size();
} finally {
executor.shutdownNow();
}
Collections.shuffle(splits, new Random(System.nanoTime()));
return splits;
}
use of com.baidu.hugegraph.backend.store.Shard in project incubator-hugegraph by apache.
the class MysqlTable method queryByRange.
protected StringBuilder queryByRange(ConditionQuery query, StringBuilder select) {
E.checkArgument(query.relations().size() == 1, "Invalid scan with multi conditions: %s", query);
Condition.Relation scan = query.relations().iterator().next();
Shard shard = (Shard) scan.value();
String page = query.page();
if (MysqlShardSplitter.START.equals(shard.start()) && MysqlShardSplitter.END.equals(shard.end()) && (page == null || page.isEmpty())) {
this.wrapLimit(select, query);
return select;
}
HugeKeys partitionKey = this.idColumnName().get(0);
if (page != null && !page.isEmpty()) {
// >= page
this.wrapPage(select, query, true);
// < end
WhereBuilder where = this.newWhereBuilder(false);
if (!MysqlShardSplitter.END.equals(shard.end())) {
where.and();
where.lt(formatKey(partitionKey), shard.end());
}
select.append(where.build());
} else {
// >= start
WhereBuilder where = this.newWhereBuilder();
boolean hasStart = false;
if (!MysqlShardSplitter.START.equals(shard.start())) {
where.gte(formatKey(partitionKey), shard.start());
hasStart = true;
}
// < end
if (!MysqlShardSplitter.END.equals(shard.end())) {
if (hasStart) {
where.and();
}
where.lt(formatKey(partitionKey), shard.end());
}
select.append(where.build());
}
this.wrapLimit(select, query);
return select;
}
use of com.baidu.hugegraph.backend.store.Shard in project incubator-hugegraph by apache.
the class EdgeCoreTest method testScanEdge.
@Test
public void testScanEdge() {
HugeGraph graph = graph();
Assume.assumeTrue("Not support scan", storeFeatures().supportsScanToken() || storeFeatures().supportsScanKeyRange());
init18Edges();
Set<Edge> edges = new HashSet<>();
long splitSize = 1L * 1024L * 1024L;
List<Shard> splits = graph.metadata(HugeType.EDGE_OUT, "splits", splitSize);
for (Shard split : splits) {
ConditionQuery q = new ConditionQuery(HugeType.EDGE);
q.scan(split.start(), split.end());
edges.addAll(ImmutableList.copyOf(graph.edges(q)));
}
Assert.assertEquals(18, edges.size());
}
use of com.baidu.hugegraph.backend.store.Shard in project incubator-hugegraph by apache.
the class RangeTest method testRangeOfRegionWithEndKey.
@Test
public void testRangeOfRegionWithEndKey() {
byte[] end = new byte[] { -3, 0x31, 0x30, 0x30, 0x30, 0x77, 0x20, 0x09, 0x38, 0x31, 0x33, 0x32, 0x35 };
Range range = new Range(START, end);
List<Shard> shards = range.splitEven(0);
Assert.assertEquals(1, shards.size());
Assert.assertEquals(Strings.EMPTY, shards.get(0).start());
Assert.assertEquals("/TEwMDB3IAk4MTMyNQ==", shards.get(0).end());
shards = range.splitEven(1);
Assert.assertEquals(1, shards.size());
Assert.assertEquals(Strings.EMPTY, shards.get(0).start());
Assert.assertEquals("/TEwMDB3IAk4MTMyNQ==", shards.get(0).end());
shards = range.splitEven(2);
Assert.assertEquals(3, shards.size());
Assert.assertEquals(Strings.EMPTY, shards.get(0).start());
Assert.assertEquals("fpiYGBg7kAScGJmZGg==", shards.get(0).end());
Assert.assertEquals("fpiYGBg7kAScGJmZGg==", shards.get(1).start());
Assert.assertEquals("/TEwMDB3IAk4MTMyNA==", shards.get(1).end());
Assert.assertEquals("/TEwMDB3IAk4MTMyNA==", shards.get(2).start());
Assert.assertEquals("/TEwMDB3IAk4MTMyNQ==", shards.get(2).end());
for (int i = 3; i < 100; i++) {
range.splitEven(i);
}
}
Aggregations