| // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. |
| // This source code is licensed under both the GPLv2 (found in the |
| // COPYING file in the root directory) and Apache 2.0 License |
| // (found in the LICENSE.Apache file in the root directory). |
| |
| #include "utilities/cassandra/cassandra_compaction_filter.h" |
| #include <string> |
| #include "rocksdb/slice.h" |
| #include "utilities/cassandra/format.h" |
| |
| |
| namespace rocksdb { |
| namespace cassandra { |
| |
| const char* CassandraCompactionFilter::Name() const { |
| return "CassandraCompactionFilter"; |
| } |
| |
| CompactionFilter::Decision CassandraCompactionFilter::FilterV2( |
| int level, |
| const Slice& key, |
| ValueType value_type, |
| const Slice& existing_value, |
| std::string* new_value, |
| std::string* skip_until) const { |
| |
| bool value_changed = false; |
| RowValue row_value = RowValue::Deserialize( |
| existing_value.data(), existing_value.size()); |
| RowValue compacted = purge_ttl_on_expiration_ ? |
| row_value.PurgeTtl(&value_changed) : |
| row_value.ExpireTtl(&value_changed); |
| |
| if(compacted.Empty()) { |
| return Decision::kRemove; |
| } |
| |
| if (value_changed) { |
| compacted.Serialize(new_value); |
| return Decision::kChangeValue; |
| } |
| |
| return Decision::kKeep; |
| } |
| |
| } // namespace cassandra |
| } // namespace rocksdb |