Search in sources :

Example 11 with Shard

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);
}
Also used : Relation(com.baidu.hugegraph.backend.query.Condition.Relation) NotSupportException(com.baidu.hugegraph.exception.NotSupportException) Shard(com.baidu.hugegraph.backend.store.Shard)

Example 12 with Shard

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;
}
Also used : ResultSet(com.datastax.driver.core.ResultSet) Set(java.util.Set) ArrayList(java.util.ArrayList) BackendException(com.baidu.hugegraph.backend.BackendException) BackendException(com.baidu.hugegraph.backend.BackendException) Random(java.util.Random) ExecutorService(java.util.concurrent.ExecutorService) Future(java.util.concurrent.Future) TokenRange(com.datastax.driver.core.TokenRange) ArrayList(java.util.ArrayList) List(java.util.List) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) TokenFactory(org.apache.cassandra.dht.Token.TokenFactory) Shard(com.baidu.hugegraph.backend.store.Shard)

Example 13 with Shard

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;
}
Also used : Condition(com.baidu.hugegraph.backend.query.Condition) Shard(com.baidu.hugegraph.backend.store.Shard) HugeKeys(com.baidu.hugegraph.type.define.HugeKeys)

Example 14 with Shard

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());
}
Also used : HugeGraph(com.baidu.hugegraph.HugeGraph) ConditionQuery(com.baidu.hugegraph.backend.query.ConditionQuery) Shard(com.baidu.hugegraph.backend.store.Shard) HugeEdge(com.baidu.hugegraph.structure.HugeEdge) FakeEdge(com.baidu.hugegraph.testutil.FakeObjects.FakeEdge) Edge(org.apache.tinkerpop.gremlin.structure.Edge) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 15 with Shard

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);
    }
}
Also used : Range(com.baidu.hugegraph.backend.store.BackendTable.ShardSplitter.Range) Shard(com.baidu.hugegraph.backend.store.Shard) Test(org.junit.Test)

Aggregations

Shard (com.baidu.hugegraph.backend.store.Shard)15 Test (org.junit.Test)6 HugeGraph (com.baidu.hugegraph.HugeGraph)4 Range (com.baidu.hugegraph.backend.store.BackendTable.ShardSplitter.Range)4 ArrayList (java.util.ArrayList)4 BackendException (com.baidu.hugegraph.backend.BackendException)3 Condition (com.baidu.hugegraph.backend.query.Condition)3 Relation (com.baidu.hugegraph.backend.query.Condition.Relation)3 NotSupportException (com.baidu.hugegraph.exception.NotSupportException)3 ResultSet (com.datastax.driver.core.ResultSet)3 List (java.util.List)3 Set (java.util.Set)3 Compress (com.baidu.hugegraph.api.filter.CompressInterceptor.Compress)2 ConditionQuery (com.baidu.hugegraph.backend.query.ConditionQuery)2 BackendEntry (com.baidu.hugegraph.backend.store.BackendEntry)2 HugeKeys (com.baidu.hugegraph.type.define.HugeKeys)2 Timed (com.codahale.metrics.annotation.Timed)2 TokenRange (com.datastax.driver.core.TokenRange)2 GET (jakarta.ws.rs.GET)2 Path (jakarta.ws.rs.Path)2