|  | /** | 
|  | *   Copyright 2016, Quickstep Research Group, Computer Sciences Department, | 
|  | *     University of Wisconsin—Madison. | 
|  | * | 
|  | *   Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | *   you may not use this file except in compliance with the License. | 
|  | *   You may obtain a copy of the License at | 
|  | * | 
|  | *       http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | *   Unless required by applicable law or agreed to in writing, software | 
|  | *   distributed under the License is distributed on an "AS IS" BASIS, | 
|  | *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | *   See the License for the specific language governing permissions and | 
|  | *   limitations under the License. | 
|  | **/ | 
|  |  | 
|  | #include "expressions/aggregation/AggregationConcreteHandle.hpp" | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <vector> | 
|  |  | 
|  | #include "catalog/CatalogTypedefs.hpp" | 
|  | #include "storage/HashTable.hpp" | 
|  | #include "storage/HashTableFactory.hpp" | 
|  |  | 
|  | namespace quickstep { | 
|  |  | 
|  | class StorageManager; | 
|  | class Type; | 
|  | class ValueAccessor; | 
|  |  | 
|  | AggregationStateHashTableBase* AggregationConcreteHandle::createDistinctifyHashTable( | 
|  | const HashTableImplType hash_table_impl, | 
|  | const std::vector<const Type*> &key_types, | 
|  | const std::size_t estimated_num_distinct_keys, | 
|  | StorageManager *storage_manager) const { | 
|  | // Create a hash table with key types as key_types and value type as bool. | 
|  | return AggregationStateHashTableFactory<bool>::CreateResizable( | 
|  | hash_table_impl, | 
|  | key_types, | 
|  | estimated_num_distinct_keys, | 
|  | storage_manager); | 
|  | } | 
|  |  | 
|  | void AggregationConcreteHandle::insertValueAccessorIntoDistinctifyHashTable( | 
|  | ValueAccessor *accessor, | 
|  | const std::vector<attribute_id> &key_ids, | 
|  | AggregationStateHashTableBase *distinctify_hash_table) const { | 
|  | // If the key-value pair is already there, we don't need to update the value, | 
|  | // which should always be "true". I.e. the value is just a placeholder. | 
|  | const auto noop_upserter = [](const auto &accessor, const bool *value) -> void {}; | 
|  |  | 
|  | AggregationStateHashTable<bool> *hash_table = | 
|  | static_cast<AggregationStateHashTable<bool>*>(distinctify_hash_table); | 
|  | if (key_ids.size() == 1) { | 
|  | hash_table->upsertValueAccessor(accessor, | 
|  | key_ids[0], | 
|  | true /* check_for_null_keys */, | 
|  | true /* initial_value */, | 
|  | &noop_upserter); | 
|  | } else { | 
|  | hash_table->upsertValueAccessorCompositeKey(accessor, | 
|  | key_ids, | 
|  | true /* check_for_null_keys */, | 
|  | true /* initial_value */, | 
|  | &noop_upserter); | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace quickstep |