/Users/deen/code/yugabyte-db/src/yb/master/yql_types_vtable.cc
Line | Count | Source |
1 | | // Copyright (c) YugaByte, Inc. |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
4 | | // in compliance with the License. You may obtain a copy of the License at |
5 | | // |
6 | | // http://www.apache.org/licenses/LICENSE-2.0 |
7 | | // |
8 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
9 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
10 | | // or implied. See the License for the specific language governing permissions and limitations |
11 | | // under the License. |
12 | | // |
13 | | |
14 | | #include "yb/master/yql_types_vtable.h" |
15 | | |
16 | | #include "yb/common/ql_type.h" |
17 | | #include "yb/common/schema.h" |
18 | | |
19 | | #include "yb/master/catalog_entity_info.h" |
20 | | #include "yb/master/catalog_manager_if.h" |
21 | | |
22 | | #include "yb/util/status_log.h" |
23 | | |
24 | | namespace yb { |
25 | | namespace master { |
26 | | |
27 | | QLTypesVTable::QLTypesVTable(const TableName& table_name, |
28 | | const NamespaceName& namespace_name, |
29 | | Master* const master) |
30 | 2.00k | : YQLVirtualTable(table_name, namespace_name, master, CreateSchema()) { |
31 | 2.00k | } |
32 | | |
33 | | Result<std::shared_ptr<QLRowBlock>> QLTypesVTable::RetrieveData( |
34 | 13.9k | const QLReadRequestPB& request) const { |
35 | 13.9k | auto vtable = std::make_shared<QLRowBlock>(schema()); |
36 | 13.9k | std::vector<scoped_refptr<UDTypeInfo> > types; |
37 | 13.9k | catalog_manager().GetAllUDTypes(&types); |
38 | | |
39 | 204 | for (const scoped_refptr<UDTypeInfo>& type : types) { |
40 | | // Get namespace for table. |
41 | 204 | auto ns_info = VERIFY_RESULT(catalog_manager().FindNamespaceById(type->namespace_id())); |
42 | | |
43 | | // Create appropriate row for the table; |
44 | 204 | QLRow& row = vtable->Extend(); |
45 | 204 | RETURN_NOT_OK(SetColumnValue(kKeyspaceName, ns_info->name(), &row)); |
46 | 204 | RETURN_NOT_OK(SetColumnValue(kTypeName, type->name(), &row)); |
47 | | |
48 | | // Create appropriate field_names entry. |
49 | 204 | QLValuePB field_names; |
50 | 204 | QLSeqValuePB *list_value = field_names.mutable_list_value(); |
51 | 599 | for (int i = 0; i < type->field_names_size(); i++) { |
52 | 395 | QLValuePB field_name; |
53 | 395 | field_name.set_string_value(type->field_names(i)); |
54 | 395 | *list_value->add_elems() = field_name; |
55 | 395 | } |
56 | 204 | RETURN_NOT_OK(SetColumnValue(kFieldNames, field_names, &row)); |
57 | | |
58 | | // Create appropriate field_types entry. |
59 | 204 | QLValuePB field_types; |
60 | 204 | list_value = field_types.mutable_list_value(); |
61 | 599 | for (int i = 0; i < type->field_types_size(); i++) { |
62 | 395 | QLValuePB field_type; |
63 | 395 | const string& field_type_name = QLType::FromQLTypePB(type->field_types(i))->ToString(); |
64 | 395 | field_type.set_string_value(field_type_name); |
65 | 395 | *list_value->add_elems() = field_type; |
66 | 395 | } |
67 | 204 | RETURN_NOT_OK(SetColumnValue(kFieldTypes, field_types, &row)); |
68 | 204 | } |
69 | | |
70 | 13.9k | return vtable; |
71 | 13.9k | } |
72 | | |
73 | 2.00k | Schema QLTypesVTable::CreateSchema() const { |
74 | 2.00k | SchemaBuilder builder; |
75 | 2.00k | CHECK_OK(builder.AddHashKeyColumn("keyspace_name", QLType::Create(DataType::STRING))); |
76 | 2.00k | CHECK_OK(builder.AddKeyColumn("type_name", QLType::Create(DataType::STRING))); |
77 | | // TODO: field_names should be a frozen list. |
78 | 2.00k | CHECK_OK(builder.AddColumn("field_names", QLType::CreateTypeList(DataType::STRING))); |
79 | | // TODO: field_types should be a frozen list. |
80 | 2.00k | CHECK_OK(builder.AddColumn("field_types", QLType::CreateTypeList(DataType::STRING))); |
81 | 2.00k | return builder.Build(); |
82 | 2.00k | } |
83 | | |
84 | | } // namespace master |
85 | | } // namespace yb |