The initial version of post_bsos is a simple repeated call to put_bso. Ideally this should be the inverse (like in the Spanner impl): put_bso should be implemented as a call to post_bsos with a vec of a single bso.
This could be tricky on Postgres using the diesel ORM as the collection of bsos could be a mix of different selective updates.
E.g. it could be a request for bso0 to update solely its payload, and bso1 to update solely its sortindex. A plain upsert on multiple bsos would want to adjust all values set on ON CONFLICT DO UPDATE SET across all the bsos (in this case payload/sortindex on both).
The python impl handles this by grouping all bsos w/ the same field updates into separate batches of updates. This would result in 2 separate upserts in the example above, one for a payload only upsert, one for a sortindex only. This sounds difficult to emulate in the strongly typed diesel ORM.
The batch commit handles a similar situation via a COALESCE on the old vs new values, which might be a better option.
┆Issue is synchronized with this Jira Task
The initial version of
post_bsosis a simple repeated call toput_bso. Ideally this should be the inverse (like in the Spanner impl):put_bsoshould be implemented as a call topost_bsoswith a vec of a single bso.This could be tricky on Postgres using the diesel ORM as the collection of bsos could be a mix of different selective updates.
E.g. it could be a request for bso0 to update solely its
payload, and bso1 to update solely itssortindex. A plain upsert on multiple bsos would want to adjust all values set onON CONFLICT DO UPDATE SETacross all the bsos (in this casepayload/sortindexon both).The python impl handles this by grouping all bsos w/ the same field updates into separate batches of updates. This would result in 2 separate upserts in the example above, one for a
payloadonly upsert, one for asortindexonly. This sounds difficult to emulate in the strongly typed diesel ORM.The batch commit handles a similar situation via a
COALESCEon the old vs new values, which might be a better option.┆Issue is synchronized with this Jira Task