@@ -710,49 +710,64 @@ public function deleteDocuments(string $collection, array $sequences, array $per
710710 }
711711
712712 /**
713- * Get internal IDs for the given documents
713+ * Assign internal IDs for the given documents
714714 *
715715 * @param string $collection
716- * @param array<string> $documentIds
717- * @param array<?int> $documentTenants
718- * @return array<string>
716+ * @param array<Document> $documents
717+ * @return array<Document>
719718 * @throws DatabaseException
720719 */
721- protected function getSequences (string $ collection , array $ documentIds , array $ documentTenants = [] ): array
720+ public function getSequences (string $ collection , array $ documents ): array
722721 {
723- $ sequences = [];
722+ $ documentIds = [];
723+ $ keys = [];
724+ $ binds = [];
724725
725- /**
726- * UID, _tenant bottleneck is ~ 5000 rows since we use _uid IN query
727- */
728- foreach (\array_chunk ($ documentIds , 1000 ) as $ documentIdsChunk ) {
729- $ sql = "
730- SELECT _uid, _id
731- FROM {$ this ->getSQLTable ($ collection )}
732- WHERE {$ this ->quote ('_uid ' )} IN ( " . implode (', ' , array_map (fn ($ index ) => ":_key_ {$ index }" , array_keys ($ documentIdsChunk ))) . ")
733- {$ this ->getTenantQuery ($ collection , tenantCount: \count ($ documentIdsChunk ))}
734- " ;
726+ foreach ($ documents as $ i => $ document ) {
727+ if (empty ($ document ->getSequence ())) {
728+ $ documentIds [] = $ document ->getId ();
735729
736- $ stmt = $ this -> getPDO ()-> prepare ( $ sql ) ;
730+ $ key = " :uid_ { $ i }" ;
737731
738- foreach ($ documentIdsChunk as $ index => $ id ) {
739- $ stmt ->bindValue (":_key_ {$ index }" , $ id );
740- }
732+ $ binds [$ key ] = $ document ->getId ();
733+ $ keys [] = $ key ;
741734
742- if ($ this ->sharedTables ) {
743- foreach ($ documentIdsChunk as $ index => $ id ) {
744- $ stmt ->bindValue (":_tenant_ {$ index }" , \array_shift ($ documentTenants ));
735+ if ($ this ->sharedTables ) {
736+ $ binds [':_tenant_ ' .$ i ] = $ document ->getTenant ();
745737 }
746738 }
739+ }
747740
748- $ stmt -> execute ();
749- $ results = $ stmt -> fetchAll (\ PDO :: FETCH_KEY_PAIR ); // Fetch as [documentId => sequence]
750- $ stmt -> closeCursor ();
741+ if ( empty ( $ documentIds )) {
742+ return $ documents ;
743+ }
751744
752- $ sequences = [...$ sequences , ...$ results ];
745+ $ placeholders = implode (', ' , array_values ($ keys ));
746+
747+ $ sql = "
748+ SELECT _uid, _id
749+ FROM {$ this ->getSQLTable ($ collection )}
750+ WHERE {$ this ->quote ('_uid ' )} IN ( {$ placeholders })
751+ {$ this ->getTenantQuery ($ collection , tenantCount: \count ($ documentIds ))}
752+ " ;
753+
754+ $ stmt = $ this ->getPDO ()->prepare ($ sql );
755+
756+ foreach ($ binds as $ key => $ value ) {
757+ $ stmt ->bindValue ($ key , $ value );
753758 }
754759
755- return $ sequences ;
760+ $ stmt ->execute ();
761+ $ sequences = $ stmt ->fetchAll (\PDO ::FETCH_KEY_PAIR ); // Fetch as [documentId => sequence]
762+ $ stmt ->closeCursor ();
763+
764+ foreach ($ documents as $ document ) {
765+ if (isset ($ sequences [$ document ->getId ()])) {
766+ $ document ['$sequence ' ] = $ sequences [$ document ->getId ()];
767+ }
768+ }
769+
770+ return $ documents ;
756771 }
757772
758773 /**
@@ -1808,8 +1823,6 @@ public function createDocuments(string $collection, array $documents): array
18081823 $ batchKeys = [];
18091824 $ bindValues = [];
18101825 $ permissions = [];
1811- $ documentIds = [];
1812- $ documentTenants = [];
18131826
18141827 foreach ($ documents as $ index => $ document ) {
18151828 $ attributes = $ document ->getAttributes ();
@@ -1820,13 +1833,10 @@ public function createDocuments(string $collection, array $documents): array
18201833
18211834 if (!empty ($ document ->getSequence ())) {
18221835 $ attributes ['_id ' ] = $ document ->getSequence ();
1823- } else {
1824- $ documentIds [] = $ document ->getId ();
18251836 }
18261837
18271838 if ($ this ->sharedTables ) {
18281839 $ attributes ['_tenant ' ] = $ document ->getTenant ();
1829- $ documentTenants [] = $ document ->getTenant ();
18301840 }
18311841
18321842 $ bindKeys = [];
@@ -1889,17 +1899,6 @@ public function createDocuments(string $collection, array $documents): array
18891899 $ this ->execute ($ stmtPermissions );
18901900 }
18911901
1892- $ sequences = $ this ->getSequences (
1893- $ collection ,
1894- $ documentIds ,
1895- $ documentTenants
1896- );
1897-
1898- foreach ($ documents as $ document ) {
1899- if (isset ($ sequences [$ document ->getId ()])) {
1900- $ document ['$sequence ' ] = $ sequences [$ document ->getId ()];
1901- }
1902- }
19031902 } catch (PDOException $ e ) {
19041903 throw $ this ->processException ($ e );
19051904 }
0 commit comments