- 
                Notifications
    You must be signed in to change notification settings 
- Fork 211
PHPC-2478: Implement API for bulkWrite command #1790
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
          
     Merged
      
      
            alcaeus
  merged 20 commits into
  mongodb:feature/client-bulk-write
from
jmikola:2.x-bulkwrite
  
      
      
   
  Apr 16, 2025 
      
    
                
     Merged
            
            PHPC-2478: Implement API for bulkWrite command #1790
                    alcaeus
  merged 20 commits into
  mongodb:feature/client-bulk-write
from
jmikola:2.x-bulkwrite
  
      
      
   
  Apr 16, 2025 
              
            Conversation
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
    fe60b8b    to
    6e8c28a      
    Compare
  
    79e33fc    to
    786f1cc      
    Compare
  
    
    
  jmikola 
      added a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      Mar 7, 2025 
    
    
  
ad72834    to
    4a48529      
    Compare
  
    It was possible to reuse WriteConcernError and WriteError with slight changes to their init functions.
This was not necessary for compilation, but it makes the header internally consistent.
Always return arrays for writeErrors and writeConcernErrors
Per CDRIVER-5843, libmongoc does not consistently populate this field. It also isn't required by the spec, so omit it for now.
Result maps should only be null if verboseResults=false. Additionally, the error reply document can default to an empty document on error (as it is in libmongoc).
Revise the stubs to reflect that executeBulkWriteCommand() always returns a BulkWriteCommandResult. If the result is unacknowledged, that is reported via isAcknowledged() and other methods can throw, which is consistent with WriteResult for the legacy bulk write API. If the result is empty on error (i.e. no writes were successful), BulkWriteCommandException::$partialResult is left unset.
This also ensures that BulkWriteCommandException uses the original server-side error code and message (if available) for top-level errors.
    
  jmikola 
      added a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      Mar 14, 2025 
    
    
  
    
  jmikola 
      added a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      Mar 21, 2025 
    
    
  
    
  jmikola 
      added a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      Mar 21, 2025 
    
    
  
    
  jmikola 
      added a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      Mar 24, 2025 
    
    
  
    
  jmikola 
      added a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      Mar 31, 2025 
    
    
  
    
  jmikola 
      added a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      Apr 1, 2025 
    
    
  
mongoc_bulkwriteexception_errorreply() always returns an initialized document, but it may be empty. This ensures that an InvalidArgumentException is not unnecessarily proxied behind a BulkWriteCommandException.
              
                    GromNaN
  
              
              approved these changes
              
                  
                    Apr 15, 2025 
                  
              
              
            
            
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I created the feature/client-bulk-write branch to continue work (add tests).
              
                    alcaeus
  
              
              approved these changes
              
                  
                    Apr 16, 2025 
                  
              
              
            
            
    
  alcaeus 
      pushed a commit
      that referenced
      this pull request
    
      May 9, 2025 
    
    
      
  
    
      
    
  
* PHPC-2478: Implement API for bulkWrite command (#1790) * PHPC-2495, PHPC-2490, PHPC-2491, PHPC-2492: BulkWriteCommand ctor and ops * PHPC-2494: BulkWriteCommandResult and BulkWriteCommandException It was possible to reuse WriteConcernError and WriteError with slight changes to their init functions. * Include missing header in WriteResult.h This was not necessary for compilation, but it makes the header internally consistent. * PHPC-2493: Manager and Server::executeBulkWriteCommand() * PHPC-2494: Handle null error fields in BulkWriteCommandResult Always return arrays for writeErrors and writeConcernErrors * PHPC-2494: Return writeErrors as an associative array * PHPC-2493: Revise error handling for mongoc_bulkwrite_execute * Consistent WriteError and WriteConcernError parsing for bulk write results * BulkWriteCommand tests * clang-format * Remove BulkWriteCommandResult::getServer() Per CDRIVER-5843, libmongoc does not consistently populate this field. It also isn't required by the spec, so omit it for now. * Check for _id extraction before appending insert * Regenerate BulkWriteCommandException arginfo * PHPC-2493: Relocate writeConcern option to executeBulkWriteCommand() * Parse sort option for replaceOne and updateOne * BulkWriteCommand::replaceOne() need not accept root-level arrays * Preserve empty documents for verbose results and error reply Result maps should only be null if verboseResults=false. Additionally, the error reply document can default to an empty document on error (as it is in libmongoc). * PHPC-2494: Relocate error fields to BulkWriteCommandException Revise the stubs to reflect that executeBulkWriteCommand() always returns a BulkWriteCommandResult. If the result is unacknowledged, that is reported via isAcknowledged() and other methods can throw, which is consistent with WriteResult for the legacy bulk write API. If the result is empty on error (i.e. no writes were successful), BulkWriteCommandException::$partialResult is left unset. * Throw BulkWriteCommandException directly for server errors This also ensures that BulkWriteCommandException uses the original server-side error code and message (if available) for top-level errors. * Check for empty error_reply instead of NULL mongoc_bulkwriteexception_errorreply() always returns an initialized document, but it may be empty. This ensures that an InvalidArgumentException is not unnecessarily proxied behind a BulkWriteCommandException. * PHPC-2571 Import BulkWrite tests for Client BulkWriteCommand (#1819) * Add tests on client bulk write replaceOne, updateMany and deleteMany (#1820) --------- Co-authored-by: Jeremy Mikola <jmikola@gmail.com>
    
  GromNaN 
      pushed a commit
        to jmikola/mongo-php-library
      that referenced
      this pull request
    
      May 9, 2025 
    
    
  
    
  alcaeus 
      added a commit
        to mongodb/mongo-php-library
      that referenced
      this pull request
    
      May 12, 2025 
    
    
      
  
    
      
    
  
* BulkWriteCommandBuilder * Test against mongodb/mongo-php-driver#1790 * Psalm stubs for PHPC BulkWriteCommand classes * BulkWriteCommandBuilder::withCollection returns a new instance * Sanity check Manager association in BulkWriteCommandBuilder * Client::bulkWrite() and ClientBulkWrite operation * Spec tests for Client::bulkWrite() * Revise error messages for readConcern and writeConcern in transactions The transaction spec requires certain language, and this is now expected in spec test for clientBulkWrite. * BulkWriteCommandBuilder is final * Re-order BulkWriteCommandBuilder methods to satisfy PedantryTest * Ignore order of non-public constructors in PedantryTest * Fix preparation of unacknowledged BulkWriteCommandResults * Skip CSFLE namedKMS tests that require schema 1.18 * Test Collection::getBuilderEncoder() and getCodec() Also fixes the return type for getBuilderEncoder() * Default BulkWriteCommandBuilder options to empty arrays This is actually required for the union assignment in createWithCollection(). The nullable arrays were copied from the extension, but are inconsistent with other PHPLIB APIs. * CRUD prose tests 3 and 4 * Update Psalm stubs for PHPC BulkWriteCommand API * CRUD prose tests 5-9 * Rename BulkWriteCommandBuilder to ClientBulkWrite Also renames the operation class to ClientBulkWriteCommand to avoid aliasing in Client. * Server::executeBulkWriteCommand() always returns a BulkWriteCommandResult * Use dropCollection() helper to ensure collections are cleaned up * Prose test 11 * Prose test 12 * Prose test 13 * Prose test 15 * Validate assigned $options property instead of ctor arg * Fix Psalm errors and update baseline * phpcs fixes * Test against v2.x * Fix CS * Remove readonly qualifier on the class, PHP 8.2 would be required * Add NoDiscard attribute to 'withCollection' methods * Switch all EXTENSION_BRANCH versions * Always build against v2.x * Append CRYPT_SHARED_LIB_PATH to autoEncryptionOpts in tests * PHPLIB-1677: Assert unset BulkWriteException.partialResult in CRUD prose tests * Use explicit null check Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Require ext-mongodb 2.1 --------- Co-authored-by: Jérôme Tamarelle <jerome@tamarelle.net> Co-authored-by: Andreas Braun <andreas.braun@mongodb.com> Co-authored-by: Andreas Braun <git@alcaeus.org> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment
  
      
  Add this suggestion to a batch that can be applied as a single commit.
  This suggestion is invalid because no changes were made to the code.
  Suggestions cannot be applied while the pull request is closed.
  Suggestions cannot be applied while viewing a subset of changes.
  Only one suggestion per line can be applied in a batch.
  Add this suggestion to a batch that can be applied as a single commit.
  Applying suggestions on deleted lines is not supported.
  You must change the existing code in this line in order to create a valid suggestion.
  Outdated suggestions cannot be applied.
  This suggestion has been applied or marked resolved.
  Suggestions cannot be applied from pending reviews.
  Suggestions cannot be applied on multi-line comments.
  Suggestions cannot be applied while the pull request is queued to merge.
  Suggestion cannot be applied right now. Please check back later.
  
    
  
    
https://jira.mongodb.org/browse/PHPC-2478
This supersedes #1763 and rebases the work on the v2.x branch.