Home | History | Annotate | Download | only in trace_processor
      1 /*
      2  * Licensed under the Apache License, Version 2.0 (the "License");
      3  * you may not use this file except in compliance with the License.
      4  * 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
      9  * distributed under the License is distributed on an "AS IS" BASIS,
     10  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     11  * See the License for the specific language governing permissions and
     12  * limitations under the License.
     13  */
     14 
     15 #ifndef SRC_TRACE_PROCESSOR_STORAGE_TABLE_H_
     16 #define SRC_TRACE_PROCESSOR_STORAGE_TABLE_H_
     17 
     18 #include <set>
     19 
     20 #include "src/trace_processor/row_iterators.h"
     21 #include "src/trace_processor/storage_columns.h"
     22 #include "src/trace_processor/storage_schema.h"
     23 #include "src/trace_processor/table.h"
     24 
     25 namespace perfetto {
     26 namespace trace_processor {
     27 
     28 // Base class for all table implementations which are backed by some data
     29 // storage.
     30 class StorageTable : public Table {
     31  public:
     32   // A cursor which abstracts common patterns found in storage backed tables. It
     33   // takes a strategy to iterate through rows and a column reporter for each
     34   // column to implement the Cursor interface.
     35   class Cursor final : public Table::Cursor {
     36    public:
     37     Cursor(StorageTable* table);
     38 
     39     // Implementation of Table::Cursor.
     40     int Filter(const QueryConstraints& qc, sqlite3_value** argv) override;
     41     int Next() override;
     42     int Eof() override;
     43     int Column(sqlite3_context*, int N) override;
     44 
     45    private:
     46     std::unique_ptr<RowIterator> iterator_;
     47     std::vector<std::unique_ptr<StorageColumn>>* columns_ = nullptr;
     48     StorageTable* table_ = nullptr;
     49   };
     50 
     51   StorageTable();
     52   virtual ~StorageTable() override;
     53 
     54   // Table implementation.
     55   base::Optional<Table::Schema> Init(int, const char* const*) override final;
     56   std::unique_ptr<Table::Cursor> CreateCursor() override;
     57 
     58   // Required methods for subclasses to implement.
     59   virtual StorageSchema CreateStorageSchema() = 0;
     60   virtual uint32_t RowCount() = 0;
     61 
     62  protected:
     63   const StorageSchema& schema() const { return schema_; }
     64 
     65   bool HasEqConstraint(const QueryConstraints&, const std::string& col_name);
     66 
     67  private:
     68   // Creates a row iterator which is optimized for a generic storage schema
     69   // (i.e. it does not make assumptions about values of columns).
     70   std::unique_ptr<RowIterator> CreateBestRowIterator(const QueryConstraints& qc,
     71                                                      sqlite3_value** argv);
     72 
     73   FilteredRowIndex CreateRangeIterator(
     74       const std::vector<QueryConstraints::Constraint>& cs,
     75       sqlite3_value** argv);
     76 
     77   std::pair<bool, bool> IsOrdered(
     78       const std::vector<QueryConstraints::OrderBy>& obs);
     79 
     80   std::vector<QueryConstraints::OrderBy> RemoveRedundantOrderBy(
     81       const std::vector<QueryConstraints::Constraint>& cs,
     82       const std::vector<QueryConstraints::OrderBy>& obs);
     83 
     84   std::vector<uint32_t> CreateSortedIndexVector(
     85       FilteredRowIndex index,
     86       const std::vector<QueryConstraints::OrderBy>& obs);
     87 
     88   StorageSchema schema_;
     89 };
     90 
     91 }  // namespace trace_processor
     92 }  // namespace perfetto
     93 
     94 #endif  // SRC_TRACE_PROCESSOR_STORAGE_TABLE_H_
     95