API coverage audit: reindexer-client (PHP, v3.1.0) vs Reindexer v5.15.0

August 3, 2026 · View on GitHub

Sources:

  • REST: cpp_src/server/contrib/server.yml (Restream/reindexer, master, 7066 lines) — 55 endpoint+method pairs.
  • gRPC: proto/reindexer.proto in the client repo — 27 RPCs of the Reindexer service.
  • Client: src/Reindexer/Services/{Database,Namespaces,Index,Item,Query}.php, src/Reindexer/Client/Api.php, src/Reindexer/Transport/Grpc/GrpcClient.php.

Client/Api.php is a pure Guzzle transport (request($method,$uri,...)) with no knowledge of endpoints; all coverage is determined by the Services.

1. REST coverage

Legend: ✅ covered directly; 🟡 reachable indirectly (same URL via a generic method, no dedicated SDK method); ❌ not covered.

EndpointMethodStatusSDK method
/dbGETDatabase::getList
/dbPOSTDatabase::create
/db/{database}DELETEDatabase::drop
/db/{db}/namespacesGETNamespaces::getList
/db/{db}/namespacesPOSTNamespaces::create
/db/{db}/namespaces/{name}GETNamespaces::get
/db/{db}/namespaces/{name}DELETENamespaces::drop
/db/{db}/namespaces/{name}/truncateDELETENamespaces::truncate
/db/{db}/namespaces/{name}/rename/{newname}GETNamespaces::rename
/db/{db}/namespaces/{name}/metalistGETNamespaces::getMetaList
/db/{db}/namespaces/{name}/metabykey/{key}GETNamespaces::getMetaDataKey
/db/{db}/namespaces/{name}/metabykey/{key}DELETENamespaces::deleteMetaDataKey (implemented in v3.1.0)
/db/{db}/namespaces/{name}/metabykeyPUTNamespaces::addMetaDataKey
/db/{db}/namespaces/{name}/itemsGETItem::get (limit/offset/sort only; no filter, fields, format, sharding, with_vectors, with_columns)
/db/{db}/namespaces/{name}/itemsPUTItem::update (precepts since v3.1.0; no format)
/db/{db}/namespaces/{name}/itemsPOSTItem::add (precepts since v3.1.0; no format)
/db/{db}/namespaces/{name}/itemsDELETEItem::delete (precepts since v3.1.0)
/db/{db}/namespaces/{name}/itemsPATCH (upsert)Item::upsert (implemented in v3.1.0)
/db/{db}/namespaces/{name}/indexesGETIndex::get
/db/{db}/namespaces/{name}/indexesPOSTIndex::create
/db/{db}/namespaces/{name}/indexesPUT (update index)Index::update (implemented in v3.1.0)
/db/{db}/namespaces/{name}/indexes/{indexname}DELETEIndex::delete
/db/{db}/namespaces/{name}/schemaGETno JSON-schema read
/db/{db}/namespaces/{name}/schemaPUTNamespaces::schema
/db/{db}/protobuf_schemaGETprotobuf schemas are not exported
/query/convert/sqlPOST (SQL→DSL)
/query/convert/dslPOST (DSL→SQL)
/db/{db}/queryGET (SQL select)Query::createByHttpGet (no with_columns/width/format)
/db/{db}/queryPUT (DSL update)Query::updateSdlQueryByHttpPut (implemented in v3.1.0)
/db/{db}/queryPOST (DSL select)Query::createSdlQueryByHttpPost
/db/{db}/queryDELETE (DSL delete)Query::deleteSdlQueryByHttpDelete (implemented in v3.1.0)
/db/{db}/namespaces/{name}/transactions/beginPOSTTransaction::begin (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/commitPOSTTransaction::commit (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/rollbackPOSTTransaction::rollback (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/itemsPUTTransaction::updateItem (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/itemsPOSTTransaction::addItem (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/itemsDELETETransaction::deleteItem (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/itemsPATCHTransaction::upsertItem (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/queryGET (SQL in tx)Transaction::sqlQuery (implemented in v3.1.0)
/db/{db}/transactions/{tx_id}/queryDELETETransaction::deleteQuery (implemented in v3.1.0)
/db/{db}/suggestGET (SQL autocompletion)
/db/{db}/sqlqueryPOST (SQL)Query::createSqlQueryByHttpPost
/checkGET (health/server version)
/allocator/drop_cachePOST
/allocator/infoGET
/user/roleGET
/db/{db}/namespaces/#activitystats/itemsGET🟡Item::get with namespace #activitystats
/db/{db}/namespaces/#clientsstats/itemsGET🟡same
/db/{db}/namespaces/#replicationstats/itemsGET🟡same
/db/{db}/namespaces/#memstats/itemsGET🟡same
/db/{db}/namespaces/#perfstats/itemsGET🟡same
/db/{db}/namespaces/#queriesperfstats/itemsGET🟡same
/db/{db}/namespaces/#config/itemsGET🟡same
/db/{db}/namespaces/#config/itemsPUT🟡Item::update with namespace #config
/db/default_configsGET

REST total: 37/55 directly = 67%; counting indirectly reachable system namespaces — 45/55 = 82%. 10 endpoints are entirely missing.

2. gRPC coverage (GrpcClient.php vs proto/reindexer.proto, 27 RPCs)

RPCStatusWrapper method
Connectconnect
CreateDatabasecreateDatabase
OpenNamespaceopenNamespace
AddNamespaceaddNamespace (implemented in v3.1.0)
CloseNamespacecloseNamespace
DropNamespacedropNamespace
TruncateNamespacetruncateNamespace
AddIndexaddIndex
UpdateIndexupdateIndex
DropIndexdropIndex
SetSchemasetSchema (implemented in v3.1.0)
EnumNamespacesenumNamespaces (onlyNames+hideSystems are hardcoded → full NamespaceDefinition is unavailable)
EnumDatabasesenumDatabases
ModifyItem (bidi stream)modifyItems
ExecSql (stream)execSql
Select (stream)select
Update (stream)update
Delete (stream)delete
GetMetagetMeta (implemented in v3.1.0)
PutMetaputMeta (implemented in v3.1.0)
EnumMetaenumMeta (implemented in v3.1.0)
DeleteMetadeleteMeta (implemented in v3.1.0)
GetProtobufSchemagetProtobufSchema (implemented in v3.1.0)
BeginTransactionbeginTransaction
AddTxItem (bidi stream)addTxItems
CommitTransactioncommitTransaction
RollbackTransactionrollbackTransaction

gRPC total: 27/27 = 100% (since v3.1.0).

Limitations within the exposed RPCs:

  • buildIndex() ignores the proto fields IndexOptions.collateMode, rtreeType, sortOrdersTable, config (fulltext/float-vector config) — even though the proto supports them.
  • Encoding is hardwired to JSON (EncodingType::JSON); CJSON/MSGPACK/PROTOBUF and the OutputFlags withRank/withJoinedItems/withItemID are unavailable.

3. Capabilities within endpoints

CapabilitySpec v5.15ClientVerdict
precepts (serial(), now())query param on items POST/PUT/DELETE/PATCH and tx items✅ HTTP since v3.1.0 (Item::* and Transaction::*Item); the proto ModifyItemRequest has no precepts field at allsupported over HTTP; unavailable over gRPC by proto design
IndexTypehash, tree, text, rtree, ttl, '-'full set since v3.1.0
FieldTypeint, int64, double, string, bool, composite, pointfull set since v3.1.0
Index entity fields+ is_sparse, is_no_column, expire_after, rtree_type, is_simple_tag, config (FulltextConfig / FloatVectorConfig)v3.1.0 adds is_sparse, expire_after, rtree_type (enum RtreeType), config (raw array)mostly supported; is_no_column and is_simple_tag are still absent
Fulltext config (FulltextConfig)config in IndexDefHTTP: Index::setConfig(array) since v3.1.0; gRPC buildIndex still ignores configsupported over HTTP (untyped array)
KNN / float_vector (hnsw/ivf, KNN filters, with_vectors)present in the master specnot reflected anywherenot supported
Aggregations, joined queries, explainin Query DSL (aggregations, filters[].join_query, explain)pass-through: Query::createSdlQueryByHttpPost and GrpcClient::select accept a raw array/JSON → works✅ works, but untyped
SdlQuery entitycurrent DSL: merge_queries, join inside filters, explain, req_total: disabled/enabled/cached, update_fields, drop_fields, typev3.1.0: all listed keys + fluent setters; req_total emits the server enum (booleans normalized); legacy joined/merged kept but deprecated✅ up to date
Protobuf schemasGET /db/{db}/protobuf_schema, RPC GetProtobufSchema, schema GETonly schema PUTnot supported
Response formats (json/msgpack/protobuf/csv-file), with_columns, width, shardingquery params on items/querynot exposednot supported

4. Prioritized gaps

(a) Important for real users — all closed in v3.1.0

  1. HTTP transactions (9 endpoints)Services\Transaction (begin, item ops with precepts, SQL/DSL queries in tx, commit/rollback).
  2. preceptsserial()/now() on every Item write method and on transaction item ops.
  3. PUT /indexes + ttl/rtree types + is_sparse/expire_after/fulltext configIndex::update, full IndexType/FieldType enums, new RtreeType enum, entity fields.
  4. PATCH /items (upsert)Item::upsert.
  5. PUT /query and DELETE /queryQuery::updateSdlQueryByHttpPut / Query::deleteSdlQueryByHttpDelete.
  6. Bringing SdlQuery up to date — current DSL keys + fluent setters; legacy joined/merged deprecated but kept.
  7. gRPC meta + HTTP DELETE metabykeyGrpcClient::{get,put,enum,delete}Meta, Namespaces::deleteMetaDataKey.

(b) Niche (still open)

  1. GET /check, GET /db/{db}/namespaces/#memstats etc. — monitoring; partially reachable via Item::get('#memstats'), but convenient typed helpers would be useful for ops.
  2. GET /db/{db}/suggest, /query/convert/* — needed by admin panels/IDE-like tools, not applications.
  3. GET schema / GET protobuf_schema over HTTP — the gRPC counterparts (SetSchema, GetProtobufSchema) are exposed since v3.1.0; the HTTP reads are not.
  4. KNN / float_vector indexes — new v5 functionality; demand for vector search from PHP is still sporadic (and it partially works via raw DSL select; the index config can now at least be passed as an array).
  5. The msgpack/protobuf/csv formats and with_columns/width — traffic optimization and console output.
  6. Non-JSON EncodingType and OutputFlags variants in gRPC; config/collateMode/sortOrdersTable in gRPC buildIndex.
  7. Index entity: is_no_column, is_simple_tag.

(c) Deliberately skippable

  1. /allocator/drop_cache, /allocator/info — low-level tcmalloc tuning; a job for ops tools, not a client library.
  2. /user/role — introspection of the current user's permissions, needed only by the admin UI (face).
  3. /db/default_configs — default configs for the UI configuration editor.
  4. System #...stats as dedicated methods — already reachable via the generic Item::get; dedicated wrappers would duplicate the URL.

5. Summary

  • REST: 67% (37/55 directly; 82% counting indirectly reachable system namespaces) — up from 42%/56% in v3.0.0.
  • gRPC: 100% (27/27 RPCs) — up from 74% in v3.0.0.