)]}'
{
  "commit": "98a4acd0dd84c2a5d7ded77345299d2087fb782a",
  "tree": "a2cf364827cd983c36eea55daf271ab9b8d1eebb",
  "parents": [
    "f29d49cff5cea6a43257f7437f3ce92858df05df"
  ],
  "author": {
    "name": "Nelson Li",
    "email": "nelsonli@google.com",
    "time": "Thu Dec 18 02:29:16 2025 +0000"
  },
  "committer": {
    "name": "Nelson Li",
    "email": "nelsonli@google.com",
    "time": "Mon Dec 22 13:56:04 2025 +0000"
  },
  "message": "Soong API: Implement Proto definition and DAO for Soong API\n\nThis CL establishes the core data layer for the Soong API.\nIt introduces the gRPC interface definition (.proto) and the Data Access\nObject (DAO) responsible for querying the SQLite database generated by\nthe soong_api_db_loader.\n\nKey changes:\n1. Proto Definition (soong_api.proto):\n   - Defines the `Module` message and `SoongApiService`.\n   - APIs return `stream Module` to support scenarios where a single\n     query matches multiple distinct modules (e.g., name collisions\n     across namespaces or multiple modules installing the same file).\n\n2. DAO Implementation (SoongApiDao.java):\n   - Implements query logic using SQLite JSON functions.\n   - Intelligent Aggregation: Rows with the same `Name` and `Path` are\n     treated as variants (e.g., x86/arm) and merged into a single\n     Module object (combining `install_files`).\n   - Distinct Separation: Rows with the same `Name` but different\n     `Path`s (e.g., source vs. prebuilt) are treated as distinct\n     modules and returned separately.\n\n3. Hermetic Testing:\n   - Added `SoongApiDaoTest.java` using an in-memory SQLite database\n     (`jdbc:sqlite::memory:`). This ensures tests are fast, reliable,\n     and do not depend on external artifacts.\n\n4. Rename metadata_db_loader:\n   - Rename `metadata_db_loader` to `soong_api_db_loader`\n\nBug: 467242563\nTest: m soong_api_tests\nTest: atest soong_api_tests --host\nChange-Id: If7b924cea05b9693786fafd71bca2e5fe621d1d4\n",
  "tree_diff": [
    {
      "type": "delete",
      "old_id": "1d6c8ed322a628fde55194c7d181e1e9c4abc232",
      "old_mode": 33188,
      "old_path": "tools/metadata_api/Android.bp",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1308278ec0718a170c534caab410e5b8496b8cdc",
      "new_mode": 33188,
      "new_path": "tools/soong_api/Android.bp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4dcb03443346c812d017cbc73d460b9e8a453403",
      "new_mode": 33188,
      "new_path": "tools/soong_api/proto/soong_api.proto"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e47ee76d18bf20453908e53fe66f07cba58b6507",
      "new_mode": 33188,
      "new_path": "tools/soong_api/src/main/java/com/android/soong/api/db/SoongApiDao.java"
    },
    {
      "type": "rename",
      "old_id": "3dc276cd053008fab76ac91fc8205919157526ff",
      "old_mode": 33188,
      "old_path": "tools/metadata_api/src/main/java/com/android/metadata/loader/MetadataLoader.java",
      "new_id": "ccf3a36e2c91e37ccf55c0b2b1555ac7f2b28c0d",
      "new_mode": 33188,
      "new_path": "tools/soong_api/src/main/java/com/android/soong/api/loader/SoongApiLoader.java",
      "score": 71
    },
    {
      "type": "rename",
      "old_id": "7ed466a24bcc0d0525db94bdfa464f47e1065cf7",
      "old_mode": 33188,
      "old_path": "tools/metadata_api/src/main/java/com/android/metadata/loader/MetadataLoaderMain.java",
      "new_id": "5e7818ed9bb0b99a47649a336af40feea2d532e4",
      "new_mode": 33188,
      "new_path": "tools/soong_api/src/main/java/com/android/soong/api/loader/SoongApiLoaderMain.java",
      "score": 75
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "32d604ee2f691544c980f1f1dc6037d3858a2995",
      "new_mode": 33188,
      "new_path": "tools/soong_api/src/test/java/com/android/soong/api/db/SoongApiDaoTest.java"
    },
    {
      "type": "rename",
      "old_id": "2912de5a0ce5e680491606573d47434504babf47",
      "old_mode": 33188,
      "old_path": "tools/metadata_api/src/test/java/com/android/metadata/loader/MetadataLoaderTest.java",
      "new_id": "5f85b76ed2e4c53b2391200ac469e5417d1d6531",
      "new_mode": 33188,
      "new_path": "tools/soong_api/src/test/java/com/android/soong/api/loader/SoongApiLoaderTest.java",
      "score": 89
    }
  ]
}
