Add queries to obtain the labels and edge types
Add two queries to be able to retrieve the labels and edge types this is done through additions to the DatabaseInfoQuery query types.
This commit is contained in:
parent
50c485fe40
commit
c4d9116c9c
@ -2932,7 +2932,7 @@ class DatabaseInfoQuery : public memgraph::query::Query {
|
||||
static const utils::TypeInfo kType;
|
||||
const utils::TypeInfo &GetTypeInfo() const override { return kType; }
|
||||
|
||||
enum class InfoType { INDEX, CONSTRAINT };
|
||||
enum class InfoType { INDEX, CONSTRAINT, EDGE_TYPES, NODE_LABELS };
|
||||
|
||||
DEFVISITABLE(QueryVisitor<void>);
|
||||
|
||||
|
@ -124,6 +124,14 @@ antlrcpp::Any CypherMainVisitor::visitDatabaseInfoQuery(MemgraphCypher::Database
|
||||
info_query->info_type_ = DatabaseInfoQuery::InfoType::CONSTRAINT;
|
||||
return info_query;
|
||||
}
|
||||
if (ctx->edgetypeInfo()) {
|
||||
info_query->info_type_ = DatabaseInfoQuery::InfoType::EDGE_TYPES;
|
||||
return info_query;
|
||||
}
|
||||
if (ctx->nodelabelInfo()) {
|
||||
info_query->info_type_ = DatabaseInfoQuery::InfoType::NODE_LABELS;
|
||||
return info_query;
|
||||
}
|
||||
// Should never get here
|
||||
throw utils::NotYetImplemented("Database info query: '{}'", ctx->getText());
|
||||
}
|
||||
|
@ -47,9 +47,13 @@ indexInfo : INDEX INFO ;
|
||||
|
||||
constraintInfo : CONSTRAINT INFO ;
|
||||
|
||||
edgetypeInfo : EDGE_TYPES INFO ;
|
||||
|
||||
nodelabelInfo : NODE_LABELS INFO ;
|
||||
|
||||
buildInfo : BUILD INFO ;
|
||||
|
||||
databaseInfoQuery : SHOW ( indexInfo | constraintInfo ) ;
|
||||
databaseInfoQuery : SHOW ( indexInfo | constraintInfo | edgetypeInfo | nodelabelInfo ) ;
|
||||
|
||||
systemInfoQuery : SHOW ( storageInfo | buildInfo ) ;
|
||||
|
||||
|
@ -61,6 +61,7 @@ memgraphCypherKeyword : cypherKeyword
|
||||
| GRANT
|
||||
| HEADER
|
||||
| IDENTIFIED
|
||||
| NODE_LABELS
|
||||
| NULLIF
|
||||
| IMPORT
|
||||
| INACTIVE
|
||||
|
@ -89,6 +89,7 @@ MULTI_DATABASE_EDIT : M U L T I UNDERSCORE D A T A B A S E UNDERSCORE E D I
|
||||
MULTI_DATABASE_USE : M U L T I UNDERSCORE D A T A B A S E UNDERSCORE U S E ;
|
||||
NEXT : N E X T ;
|
||||
NO : N O ;
|
||||
NODE_LABELS : N O D E UNDERSCORE L A B E L S ;
|
||||
NOTHING : N O T H I N G ;
|
||||
ON_DISK_TRANSACTIONAL : O N UNDERSCORE D I S K UNDERSCORE T R A N S A C T I O N A L ;
|
||||
NULLIF : N U L L I F ;
|
||||
|
@ -38,6 +38,9 @@ class PrivilegeExtractor : public QueryVisitor<void>, public HierarchicalTreeVis
|
||||
void Visit(DatabaseInfoQuery &info_query) override {
|
||||
switch (info_query.info_type_) {
|
||||
case DatabaseInfoQuery::InfoType::INDEX:
|
||||
// TODO: Reconsider priviliges, this 4 should have the same.
|
||||
case DatabaseInfoQuery::InfoType::EDGE_TYPES:
|
||||
case DatabaseInfoQuery::InfoType::NODE_LABELS:
|
||||
// TODO: This should be INDEX | STATS, but we don't have support for
|
||||
// *or* with privileges.
|
||||
AddPrivilege(AuthQuery::Privilege::INDEX);
|
||||
|
@ -3076,6 +3076,38 @@ PreparedQuery PrepareDatabaseInfoQuery(ParsedQuery parsed_query, bool in_explici
|
||||
};
|
||||
break;
|
||||
}
|
||||
case DatabaseInfoQuery::InfoType::EDGE_TYPES: {
|
||||
header = {"edge types"};
|
||||
handler = [storage = current_db.db_acc_->get()->storage(), dba] {
|
||||
auto edge_types = dba->ListAllPossiblyPresentEdgeTypes();
|
||||
std::vector<std::vector<TypedValue>> results;
|
||||
results.reserve(edge_types.size());
|
||||
for (auto &edge_type : edge_types) {
|
||||
results.push_back({TypedValue(edge_type)});
|
||||
}
|
||||
|
||||
return std::pair{results, QueryHandlerResult::COMMIT};
|
||||
};
|
||||
|
||||
break;
|
||||
}
|
||||
case DatabaseInfoQuery::InfoType::NODE_LABELS: {
|
||||
header = {"node labels"};
|
||||
handler = [storage = current_db.db_acc_->get()->storage(), dba] {
|
||||
auto node_labels = dba->ListAllPossiblyPresentVertexLabels();
|
||||
std::vector<std::vector<TypedValue>> results;
|
||||
results.reserve(node_labels.size());
|
||||
for (auto &node_label : node_labels) {
|
||||
results.push_back({TypedValue(node_label)});
|
||||
}
|
||||
|
||||
return std::pair{results, QueryHandlerResult::COMMIT};
|
||||
};
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// NODE_LABELS
|
||||
}
|
||||
|
||||
return PreparedQuery{std::move(header), std::move(parsed_query.required_privileges),
|
||||
|
Loading…
Reference in New Issue
Block a user