Skip to content

Commit

Permalink
adding rest of connected
Browse files Browse the repository at this point in the history
  • Loading branch information
maxdemarzi committed Oct 17, 2021
1 parent c4579e0 commit bab4d1b
Show file tree
Hide file tree
Showing 4 changed files with 206 additions and 16 deletions.
12 changes: 6 additions & 6 deletions src/graph/peered/All.cpp
Expand Up @@ -33,7 +33,7 @@ namespace ragedb {
auto p = make_shared(std::move(futures));
return seastar::when_all_succeed(p->begin(), p->end()).then([p, skip, max, limit, this] (const std::vector<std::map<uint16_t, uint64_t>>& results) {
uint64_t current = 0;
uint64_t next = 0;
uint64_t next;
int current_shard_id = 0;
std::vector<uint64_t> ids;
std::map<uint16_t, std::map<uint16_t, std::pair<uint64_t , uint64_t>>> requests;
Expand Down Expand Up @@ -99,7 +99,7 @@ namespace ragedb {
auto p = make_shared(std::move(futures));
return seastar::when_all_succeed(p->begin(), p->end()).then([p, node_type_id, skip, max, limit, this] (const std::vector<uint64_t>& results) {
uint64_t current = 0;
uint64_t next = 0;
uint64_t next;
int current_shard_id = 0;
std::vector<uint64_t> ids;
std::map<uint16_t, std::pair<uint64_t , uint64_t>> requests;
Expand Down Expand Up @@ -283,7 +283,7 @@ namespace ragedb {
auto p = make_shared(std::move(futures));
return seastar::when_all_succeed(p->begin(), p->end()).then([p, skip, max, limit, this] (const std::vector<std::map<uint16_t, uint64_t>>& results) {
uint64_t current = 0;
uint64_t next = 0;
uint64_t next;
int current_shard_id = 0;
std::vector<uint64_t> ids;
std::map<uint16_t, std::map<uint16_t, std::pair<uint64_t , uint64_t>>> requests;
Expand Down Expand Up @@ -349,7 +349,7 @@ namespace ragedb {
auto p = make_shared(std::move(futures));
return seastar::when_all_succeed(p->begin(), p->end()).then([p, relationship_type_id, skip, max, limit, this] (const std::vector<uint64_t>& results) {
uint64_t current = 0;
uint64_t next = 0;
uint64_t next;
int current_shard_id = 0;
std::vector<uint64_t> ids;
std::map<uint16_t, std::pair<uint64_t , uint64_t>> requests;
Expand Down Expand Up @@ -408,7 +408,7 @@ namespace ragedb {
auto p = make_shared(std::move(futures));
return seastar::when_all_succeed(p->begin(), p->end()).then([p, skip, max, limit, this] (const std::vector<std::map<uint16_t, uint64_t>>& results) {
uint64_t current = 0;
uint64_t next = 0;
uint64_t next;
int current_shard_id = 0;
std::vector<uint64_t> ids;
std::map<uint16_t, std::map<uint16_t, std::pair<uint64_t , uint64_t>>> requests;
Expand Down Expand Up @@ -474,7 +474,7 @@ namespace ragedb {
auto p = make_shared(std::move(futures));
return seastar::when_all_succeed(p->begin(), p->end()).then([p, relationship_type_id, skip, max, limit, this] (const std::vector<uint64_t>& results) {
uint64_t current = 0;
uint64_t next = 0;
uint64_t next;
int current_shard_id = 0;
std::vector<uint64_t> ids;
std::map<uint16_t, std::pair<uint64_t , uint64_t>> requests;
Expand Down
196 changes: 194 additions & 2 deletions src/graph/peered/Connected.cpp
Expand Up @@ -49,6 +49,108 @@ namespace ragedb {

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(const std::string& type1, const std::string& key1, const std::string& type2, const std::string& key2, const std::string& rel_type) {
uint16_t shard_id1 = CalculateShardId(type1, key1);
uint16_t shard_id2 = CalculateShardId(type2, key2);

// Shortcut if the shards are the same
if (shard_id1 == shard_id2) {

return container().invoke_on(shard_id1, [type1, key1, type2, key2, rel_type, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, BOTH, rel_type);
uint64_t node_id2 = local_shard.NodeGetID(type2, key2);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}
// Nodes are on different Shards, so get the node id first, then check for it
return container().invoke_on(shard_id2, [type2, key2](Shard &local_shard) {
return local_shard.NodeGetID(type2, key2);
}).then([this, shard_id1, type1, key1, rel_type](uint64_t node_id2) {
return container().invoke_on(shard_id1, [type1, key1, node_id2, rel_type, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, BOTH, rel_type);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(const std::string& type1, const std::string& key1, const std::string& type2, const std::string& key2, uint16_t type_id) {
uint16_t shard_id1 = CalculateShardId(type1, key1);
uint16_t shard_id2 = CalculateShardId(type2, key2);

// Shortcut if the shards are the same
if (shard_id1 == shard_id2) {

return container().invoke_on(shard_id1, [type1, key1, type2, key2, type_id, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, BOTH, type_id);
uint64_t node_id2 = local_shard.NodeGetID(type2, key2);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}
// Nodes are on different Shards, so get the node id first, then check for it
return container().invoke_on(shard_id2, [type2, key2](Shard &local_shard) {
return local_shard.NodeGetID(type2, key2);
}).then([this, shard_id1, type1, key1, type_id](uint64_t node_id2) {
return container().invoke_on(shard_id1, [type1, key1, node_id2, type_id, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, BOTH, type_id);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(const std::string& type1, const std::string& key1, const std::string& type2, const std::string& key2, const std::vector<std::string> &rel_types) {
uint16_t shard_id1 = CalculateShardId(type1, key1);
uint16_t shard_id2 = CalculateShardId(type2, key2);

// Shortcut if the shards are the same
if (shard_id1 == shard_id2) {

return container().invoke_on(shard_id1, [type1, key1, type2, key2, rel_types, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, BOTH, rel_types);
uint64_t node_id2 = local_shard.NodeGetID(type2, key2);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}
// Nodes are on different Shards, so get the node id first, then check for it
return container().invoke_on(shard_id2, [type2, key2](Shard &local_shard) {
return local_shard.NodeGetID(type2, key2);
}).then([this, shard_id1, type1, key1, rel_types](uint64_t node_id2) {
return container().invoke_on(shard_id1, [type1, key1, node_id2, rel_types, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, BOTH, rel_types);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(const std::string& type1, const std::string& key1, const std::string& type2, const std::string& key2, Direction direction) {
uint16_t shard_id1 = CalculateShardId(type1, key1);
uint16_t shard_id2 = CalculateShardId(type2, key2);
Expand Down Expand Up @@ -106,7 +208,41 @@ namespace ragedb {
return local_shard.NodeGetID(type2, key2);
}).then([this, shard_id1, type1, key1, direction, rel_type](uint64_t node_id2) {
return container().invoke_on(shard_id1, [type1, key1, node_id2, direction, rel_type, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, direction);
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, direction, rel_type);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(const std::string& type1, const std::string& key1, const std::string& type2, const std::string& key2, Direction direction, uint16_t type_id) {
uint16_t shard_id1 = CalculateShardId(type1, key1);
uint16_t shard_id2 = CalculateShardId(type2, key2);

// Shortcut if the shards are the same
if (shard_id1 == shard_id2) {

return container().invoke_on(shard_id1, [type1, key1, type2, key2, direction, type_id, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, direction, type_id);
uint64_t node_id2 = local_shard.NodeGetID(type2, key2);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}
// Nodes are on different Shards, so get the node id first, then check for it
return container().invoke_on(shard_id2, [type2, key2](Shard &local_shard) {
return local_shard.NodeGetID(type2, key2);
}).then([this, shard_id1, type1, key1, direction, type_id](uint64_t node_id2) {
return container().invoke_on(shard_id1, [type1, key1, node_id2, direction, type_id, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, direction, type_id);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());
Expand Down Expand Up @@ -140,7 +276,7 @@ namespace ragedb {
return local_shard.NodeGetID(type2, key2);
}).then([this, shard_id1, type1, key1, direction, rel_types](uint64_t node_id2) {
return container().invoke_on(shard_id1, [type1, key1, node_id2, direction, rel_types, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, direction);
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(type1, key1, direction, rel_types);

auto it = remove_if(links.begin(), links.end(), [node_id2](Link link) { return link.node_id != node_id2; });
links.erase(it, links.end());
Expand All @@ -165,6 +301,48 @@ namespace ragedb {

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(uint64_t id, uint64_t id2, const std::string& rel_type) {
uint16_t shard_id1 = CalculateShardId(id);

return container().invoke_on(shard_id1, [id, id2, rel_type, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(id, BOTH, rel_type);

auto it = remove_if(links.begin(), links.end(), [id2](Link link) { return link.node_id != id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(uint64_t id, uint64_t id2, uint16_t type_id) {
uint16_t shard_id1 = CalculateShardId(id);

return container().invoke_on(shard_id1, [id, id2, type_id, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(id, BOTH, type_id);

auto it = remove_if(links.begin(), links.end(), [id2](Link link) { return link.node_id != id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(uint64_t id, uint64_t id2, const std::vector<std::string> &rel_types) {
uint16_t shard_id1 = CalculateShardId(id);

return container().invoke_on(shard_id1, [id, id2, rel_types, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(id, BOTH, rel_types);

auto it = remove_if(links.begin(), links.end(), [id2](Link link) { return link.node_id != id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(uint64_t id, uint64_t id2, Direction direction) {
uint16_t shard_id1 = CalculateShardId(id);

Expand Down Expand Up @@ -193,6 +371,20 @@ namespace ragedb {

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(uint64_t id, uint64_t id2, Direction direction, uint16_t type_id) {
uint16_t shard_id1 = CalculateShardId(id);

return container().invoke_on(shard_id1, [id, id2, direction, type_id, this](Shard &local_shard) {
std::vector<Link> links = local_shard.NodeGetRelationshipsIDs(id, direction, type_id);

auto it = remove_if(links.begin(), links.end(), [id2](Link link) { return link.node_id != id2; });
links.erase(it, links.end());

return RelationshipsGetPeered(links);
});

}

seastar::future<std::vector<Relationship>> Shard::NodeGetConnectedPeered(uint64_t id, uint64_t id2, Direction direction, const std::vector<std::string> &rel_types) {
uint16_t shard_id1 = CalculateShardId(id);

Expand Down
4 changes: 2 additions & 2 deletions src/graph/peered/Restore.cpp
Expand Up @@ -21,8 +21,8 @@ namespace ragedb {

std::map<std::string, std::string> parseURL(std::string url) {
std::map<std::string, std::string> result;
size_t start = 0;
size_t pos = 0;
size_t start;
size_t pos;
const std::string http_delimiter = "http";
const std::string method_delimiter = "&method=";
const std::string body_delimiter = "&body=";
Expand Down
10 changes: 4 additions & 6 deletions src/graph/shard/Relationships.cpp
Expand Up @@ -168,10 +168,8 @@ namespace ragedb {

uint64_t Shard::RelationshipAddToOutgoing(uint16_t rel_type_id, uint64_t id1, uint64_t id2, const std::string& properties) {
uint64_t internal_id1 = externalToInternal(id1);
uint64_t internal_id2 = externalToInternal(id2);
uint16_t id1_type_id = externalToTypeId(id1);
uint16_t id2_type_id = externalToTypeId(id2);
uint64_t external_id = 0;
uint64_t external_id = 0;

uint64_t internal_id = relationship_types.getCount(rel_type_id);
if(relationship_types.hasDeleted(rel_type_id)) {
Expand Down Expand Up @@ -244,7 +242,7 @@ namespace ragedb {
if (ValidRelationshipId(rel_id)) {
return relationship_types.getRelationship(rel_id);
} // Invalid Relationship
return Relationship();
return {};
}

std::string Shard::RelationshipGetType(uint64_t id) {
Expand Down Expand Up @@ -283,7 +281,7 @@ namespace ragedb {
if (ValidRelationshipId(id)) {
return relationship_types.getRelationshipProperty(id, property);
}
return std::any();
return {};
}

bool Shard::RelationshipPropertySet(uint64_t id, const std::string& property, const std::any& value) {
Expand Down Expand Up @@ -311,7 +309,7 @@ namespace ragedb {
if (ValidRelationshipId(id)) {
return relationship_types.getRelationshipProperties(externalToTypeId(id), externalToInternal(id));
}
return std::map<std::string, std::any>();
return {};
}

bool Shard::RelationshipPropertiesSetFromJson(uint64_t id, const std::string& value) {
Expand Down

0 comments on commit bab4d1b

Please sign in to comment.