trace_processor: migrate slice table to new database tables

With all the perf improvements, this code should be as fast as the existing
code (or potentially faster) for existing usecases (UI and metrics).

Context: go/perfetto-tp-refactor
Bug: 135177627
Change-Id: I68174d5c0499844f5cd209b983a33036443079bf
diff --git a/src/trace_processor/export_json_unittest.cc b/src/trace_processor/export_json_unittest.cc
index 6acfa96..ded2e75 100644
--- a/src/trace_processor/export_json_unittest.cc
+++ b/src/trace_processor/export_json_unittest.cc
@@ -119,9 +119,11 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, kDuration, track, utid, RefType::kRefUtid, cat_id, name_id, 0,
-      0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert({kTimestamp, kDuration, track,
+                                                   utid, ref_type_id, cat_id,
+                                                   name_id, 0, 0, 0});
   context_.storage->mutable_thread_slices()->AddThreadSlice(
       0, kThreadTimestamp, kThreadDuration, kThreadInstructionCount,
       kThreadInstructionDelta);
@@ -167,9 +169,11 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, kDuration, track, utid, RefType::kRefUtid, cat_id, name_id, 0,
-      0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert({kTimestamp, kDuration, track,
+                                                   utid, ref_type_id, cat_id,
+                                                   name_id, 0, 0, 0});
   context_.storage->mutable_thread_slices()->AddThreadSlice(
       0, kThreadTimestamp, kThreadDuration, kThreadInstructionCount,
       kThreadInstructionDelta);
@@ -230,8 +234,10 @@
 
   StringId cat_id = context_.storage->InternString("cat");
   StringId name_id = context_.storage->InternString("name");
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      0, 0, track, track, RefType::kRefTrack, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefTrack)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {0, 0, track, track, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -402,8 +408,10 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      0, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {0, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   StringId arg_key_id = context_.storage->InternString(
       base::StringView("task.posted_from.file_name"));
@@ -414,7 +422,7 @@
   arg.key = arg_key_id;
   arg.value = Variadic::String(arg_value_id);
   ArgSetId args = context_.storage->mutable_args()->AddArgSet({arg}, 0, 1);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -447,10 +455,12 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = storage->InternString(base::StringView(kCategory));
   StringId name_id = storage->InternString(base::StringView(kName));
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
   RowId row_id = TraceStorage::CreateRowId(
       kNestableSlices,
-      storage->mutable_nestable_slices()->AddSlice(
-          0, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0));
+      storage->mutable_slice_table()->Insert(
+          {0, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0}));
 
   auto add_arg = [&](const char* key, Variadic value) {
     StringId key_id = storage->InternString(key);
@@ -497,8 +507,10 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      0, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {0, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   StringId arg_flat_key_id = context_.storage->InternString(
       base::StringView("debug.draw_duration_ms"));
@@ -516,7 +528,7 @@
   arg1.value = Variadic::Real(kValues[1]);
   ArgSetId args =
       context_.storage->mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -547,8 +559,10 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      0, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {0, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   StringId arg_key0_id =
       context_.storage->InternString(base::StringView("arg0"));
@@ -564,7 +578,7 @@
   arg1.value = Variadic::Pointer(kValue1);
   ArgSetId args =
       context_.storage->mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -593,8 +607,10 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      0, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {0, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   StringId arg_flat_key_id =
       context_.storage->InternString(base::StringView("a.b"));
@@ -612,7 +628,7 @@
   arg1.value = Variadic::Integer(kValues[1]);
   ArgSetId args =
       context_.storage->mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -642,8 +658,10 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      0, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {0, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   StringId arg_flat_key_id =
       context_.storage->InternString(base::StringView("a"));
@@ -661,7 +679,7 @@
   arg1.value = Variadic::Integer(kValues[1]);
   ArgSetId args =
       context_.storage->mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -691,8 +709,10 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      0, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {0, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   StringId arg_key_id = context_.storage->InternString(base::StringView("a"));
   StringId arg_value_id =
@@ -702,7 +722,7 @@
   arg.key = arg_key_id;
   arg.value = Variadic::Json(arg_value_id);
   ArgSetId args = context_.storage->mutable_args()->AddArgSet({arg}, 0, 1);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -729,8 +749,9 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, 0, track, 0, RefType::kRefNoRef, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(base::StringView());
+  context_.storage->mutable_slice_table()->Insert(
+      {kTimestamp, 0, track, 0, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -761,8 +782,10 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, 0, track, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
+  context_.storage->mutable_slice_table()->Insert(
+      {kTimestamp, 0, track, utid, ref_type_id, cat_id, name_id, 0, 0, 0});
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -794,6 +817,8 @@
   UniquePid upid = context_.storage->AddEmptyProcess(kProcessID);
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefTrack)]);
 
   constexpr int64_t kSourceId = 235;
   TrackId track = context_.track_tracker->InternLegacyChromeAsyncTrack(
@@ -801,9 +826,9 @@
       /*source_scope=*/0);
   context_.args_tracker->Flush();  // Flush track args.
 
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, kDuration, track, track, RefType::kRefTrack, cat_id, name_id,
-      0, 0, 0);
+  context_.storage->mutable_slice_table()->Insert({kTimestamp, kDuration, track,
+                                                   track, ref_type_id, cat_id,
+                                                   name_id, 0, 0, 0});
   StringId arg_key_id =
       context_.storage->InternString(base::StringView(kArgName));
   TraceStorage::Args::Arg arg;
@@ -811,7 +836,7 @@
   arg.key = arg_key_id;
   arg.value = Variadic::Integer(kArgValue);
   ArgSetId args = context_.storage->mutable_args()->AddArgSet({arg}, 0, 1);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -858,6 +883,8 @@
   UniquePid upid = context_.storage->AddEmptyProcess(kProcessID);
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefTrack)]);
 
   constexpr int64_t kSourceId = 235;
   TrackId track = context_.track_tracker->InternLegacyChromeAsyncTrack(
@@ -865,9 +892,9 @@
       /*source_scope=*/0);
   context_.args_tracker->Flush();  // Flush track args.
 
-  auto slice_id = context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, kDuration, track, track, RefType::kRefTrack, cat_id, name_id,
-      0, 0, 0);
+  auto slice_id = context_.storage->mutable_slice_table()->Insert(
+      {kTimestamp, kDuration, track, track, ref_type_id, cat_id, name_id, 0, 0,
+       0});
   context_.storage->mutable_virtual_track_slices()->AddVirtualTrackSlice(
       slice_id, kThreadTimestamp, kThreadDuration, 0, 0);
 
@@ -914,6 +941,8 @@
   UniquePid upid = context_.storage->AddEmptyProcess(kProcessID);
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefTrack)]);
 
   constexpr int64_t kSourceId = 235;
   TrackId track = context_.track_tracker->InternLegacyChromeAsyncTrack(
@@ -921,9 +950,9 @@
       /*source_scope=*/0);
   context_.args_tracker->Flush();  // Flush track args.
 
-  auto slice_id = context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, kDuration, track, track, RefType::kRefTrack, cat_id, name_id,
-      0, 0, 0);
+  auto slice_id = context_.storage->mutable_slice_table()->Insert(
+      {kTimestamp, kDuration, track, track, ref_type_id, cat_id, name_id, 0, 0,
+       0});
   context_.storage->mutable_virtual_track_slices()->AddVirtualTrackSlice(
       slice_id, kThreadTimestamp, kThreadDuration, 0, 0);
 
@@ -958,6 +987,8 @@
   UniquePid upid = context_.storage->AddEmptyProcess(kProcessID);
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefTrack)]);
 
   constexpr int64_t kSourceId = 235;
   TrackId track = context_.track_tracker->InternLegacyChromeAsyncTrack(
@@ -965,9 +996,8 @@
       /*source_scope=*/0);
   context_.args_tracker->Flush();  // Flush track args.
 
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp, 0, track, track, RefType::kRefTrack, cat_id, name_id, 0, 0,
-      0);
+  context_.storage->mutable_slice_table()->Insert(
+      {kTimestamp, 0, track, track, ref_type_id, cat_id, name_id, 0, 0, 0});
   StringId arg_key_id =
       context_.storage->InternString(base::StringView("arg_name"));
   TraceStorage::Args::Arg arg;
@@ -975,7 +1005,7 @@
   arg.key = arg_key_id;
   arg.value = Variadic::Integer(kArgValue);
   ArgSetId args = context_.storage->mutable_args()->AddArgSet({arg}, 0, 1);
-  context_.storage->mutable_nestable_slices()->set_arg_set_id(0, args);
+  context_.storage->mutable_slice_table()->mutable_arg_set_id()->Set(0, args);
 
   base::TempFile temp_file = base::TempFile::Create();
   FILE* output = fopen(temp_file.path().c_str(), "w+");
@@ -1220,13 +1250,15 @@
   StringId arg1_id = context_.storage->InternString(base::StringView("arg1"));
   StringId arg2_id = context_.storage->InternString(base::StringView("arg2"));
   StringId val_id = context_.storage->InternString(base::StringView("val"));
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
 
   std::array<RowId, 3> slice_ids;
   for (size_t i = 0; i < name_ids.size(); i++) {
     slice_ids[i] = TraceStorage::CreateRowId(
-        kNestableSlices, context_.storage->mutable_nestable_slices()->AddSlice(
-                             0, 0, track, utid, RefType::kRefUtid, cat_id,
-                             name_ids[i], 0, 0, 0));
+        kNestableSlices,
+        context_.storage->mutable_slice_table()->Insert(
+            {0, 0, track, utid, ref_type_id, cat_id, name_ids[i], 0, 0, 0}));
   }
 
   for (RowId row : slice_ids) {
@@ -1326,13 +1358,15 @@
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
+  StringId ref_type_id = context_.storage->InternString(
+      GetRefTypeStringMap()[static_cast<uint32_t>(RefType::kRefUtid)]);
 
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp1, kDuration, track, utid, RefType::kRefUtid, cat_id, name_id,
-      0, 0, 0);
-  context_.storage->mutable_nestable_slices()->AddSlice(
-      kTimestamp2, kDuration, track, utid, RefType::kRefUtid, cat_id, name_id,
-      0, 0, 0);
+  context_.storage->mutable_slice_table()->Insert({kTimestamp1, kDuration,
+                                                   track, utid, ref_type_id,
+                                                   cat_id, name_id, 0, 0, 0});
+  context_.storage->mutable_slice_table()->Insert({kTimestamp2, kDuration,
+                                                   track, utid, ref_type_id,
+                                                   cat_id, name_id, 0, 0, 0});
 
   auto label_filter = [](const char* label_name) {
     return strcmp(label_name, "traceEvents") == 0;