You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by ji...@apache.org on 2017/09/18 19:33:08 UTC
[4/6] incubator-quickstep git commit: Update analyze
Update analyze
Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/c330345b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/c330345b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/c330345b
Branch: refs/heads/trace
Commit: c330345b01fa5d2c75d0bf57cc0643f146b1c959
Parents: aa94251
Author: Jianqiao Zhu <ji...@cs.wisc.edu>
Authored: Tue Sep 12 00:12:08 2017 -0500
Committer: jianqiao <ji...@node-2.jianqiao.quickstep-pg0.wisc.cloudlab.us>
Committed: Mon Sep 18 14:31:35 2017 -0500
----------------------------------------------------------------------
cli/CommandExecutor.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 82 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/c330345b/cli/CommandExecutor.cpp
----------------------------------------------------------------------
diff --git a/cli/CommandExecutor.cpp b/cli/CommandExecutor.cpp
index fb0dd4c..1dfb89a 100644
--- a/cli/CommandExecutor.cpp
+++ b/cli/CommandExecutor.cpp
@@ -370,6 +370,88 @@ void ExecuteAnalyzeRange(const PtrVector<ParseString> &arguments,
query_processor->saveCatalog();
}
+void ExecuteAnalyzeRange(const PtrVector<ParseString> &arguments,
+ const tmb::client_id main_thread_client_id,
+ const tmb::client_id foreman_client_id,
+ MessageBus *bus,
+ StorageManager *storage_manager,
+ QueryProcessor *query_processor,
+ FILE *out) {
+ const CatalogDatabase &database = *query_processor->getDefaultDatabase();
+
+ std::unique_ptr<SqlParserWrapper> parser_wrapper(new SqlParserWrapper());
+ std::vector<std::reference_wrapper<const CatalogRelation>> relations;
+ if (arguments.empty()) {
+ relations.insert(relations.begin(), database.begin(), database.end());
+ } else {
+ for (const auto &rel_name : arguments) {
+ const CatalogRelation *rel = database.getRelationByName(rel_name.value());
+ if (rel == nullptr) {
+ THROW_SQL_ERROR_AT(&rel_name) << "Table does not exist";
+ } else {
+ relations.emplace_back(*rel);
+ }
+ }
+ }
+
+ // Analyze each relation in the database.
+ for (const CatalogRelation &relation : relations) {
+ fprintf(out, "Analyzing %s ... ", relation.getName().c_str());
+ fflush(out);
+
+ CatalogRelation *mutable_relation =
+ query_processor->getDefaultDatabase()->getRelationByIdMutable(relation.getID());
+ CatalogRelationStatistics *mutable_stat =
+ mutable_relation->getStatisticsMutable();
+
+ if (!mutable_stat->isExact()) {
+ mutable_stat->clear();
+
+ const std::string rel_name = EscapeQuotes(relation.getName(), '"');
+
+ for (const CatalogAttribute &attribute : relation) {
+ const std::string attr_name = EscapeQuotes(attribute.getName(), '"');
+ const Type &attr_type = attribute.getType();
+ bool is_min_applicable =
+ AggregateFunctionMin::Instance().canApplyToTypes({&attr_type});
+ bool is_max_applicable =
+ AggregateFunctionMax::Instance().canApplyToTypes({&attr_type});
+ if (!is_min_applicable || !is_max_applicable) {
+ continue;
+ }
+
+ std::string query_string = "SELECT MIN(\"";
+ query_string.append(attr_name);
+ query_string.append("\"), MAX(\"");
+ query_string.append(attr_name);
+ query_string.append("\") FROM \"");
+ query_string.append(rel_name);
+ query_string.append("\";");
+
+ std::vector<TypedValue> results =
+ ExecuteQueryForSingleRow(main_thread_client_id,
+ foreman_client_id,
+ query_string,
+ bus,
+ storage_manager,
+ query_processor,
+ parser_wrapper.get());
+ DCHECK_EQ(2u, results.size());
+
+ const attribute_id attr_id = attribute.getID();
+ mutable_stat->setMinValue(attr_id, results[0]);
+ mutable_stat->setMaxValue(attr_id, results[1]);
+ }
+
+ mutable_stat->setExactness(true);
+ }
+ fprintf(out, "done\n");
+ fflush(out);
+ }
+ query_processor->markCatalogAltered();
+ query_processor->saveCatalog();
+}
+
} // namespace
void executeCommand(const ParseStatement &statement,