Skip to content

Commit 36cf304

Browse files
committed
PHPC-1561: Allow hinting for delete
1 parent 6217d48 commit 36cf304

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

src/MongoDB/BulkWrite.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,10 @@ static bool php_phongo_bulkwrite_delete_apply_options(bson_t* boptions, zval* zo
297297
PHONGO_BULKWRITE_APPEND_INT32("limit", limit);
298298
PHONGO_BULKWRITE_OPT_DOCUMENT("collation");
299299

300+
if (!php_phongo_bulkwrite_opt_hint(boptions, zoptions)) {
301+
return false;
302+
}
303+
300304
return true;
301305
} /* }}} */
302306

tests/bulk/bulkwrite-delete-002.phpt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
--TEST--
2+
MongoDB\Driver\BulkWrite::delete() with hint option
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_live(); ?>
6+
<?php skip_if_server_version('<', '4.3.4'); ?>
7+
<?php skip_if_not_clean(); ?>
8+
--FILE--
9+
<?php
10+
require_once __DIR__ . "/../utils/basic.inc";
11+
12+
class CommandLogger implements MongoDB\Driver\Monitoring\CommandSubscriber
13+
{
14+
public function commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event)
15+
{
16+
if ($event->getCommandName() !== 'delete') {
17+
return;
18+
}
19+
20+
printf("delete included hint: %s\n", json_encode($event->getCommand()->deletes[0]->hint));
21+
}
22+
23+
public function commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event)
24+
{
25+
}
26+
27+
public function commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event)
28+
{
29+
}
30+
}
31+
32+
$manager = new MongoDB\Driver\Manager(URI);
33+
34+
$bulk = new MongoDB\Driver\BulkWrite();
35+
$bulk->insert(['x' => 1]);
36+
$bulk->insert(['x' => 2]);
37+
$manager->executeBulkWrite(NS, $bulk);
38+
39+
MongoDB\Driver\Monitoring\addSubscriber(new CommandLogger);
40+
41+
$bulk = new MongoDB\Driver\BulkWrite;
42+
$bulk->delete(['_id' => 1], ['hint' => '_id_']);
43+
$manager->executeBulkWrite(NS, $bulk);
44+
45+
$bulk = new MongoDB\Driver\BulkWrite;
46+
$bulk->delete(['_id' => 2], ['hint' => ['_id' => 1]]);
47+
$manager->executeBulkWrite(NS, $bulk);
48+
49+
?>
50+
===DONE===
51+
<?php exit(0); ?>
52+
--EXPECTF--
53+
delete included hint: "_id_"
54+
delete included hint: {"_id":1}
55+
===DONE===

tests/bulk/bulkwrite-delete_error-001.phpt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ $bulk = new MongoDB\Driver\BulkWrite;
99

1010
echo throws(function() use ($bulk) {
1111
$bulk->delete(['x' => 1], ['collation' => 1]);
12+
}, 'MongoDB\Driver\Exception\InvalidArgumentException'), "\n\n";
13+
14+
echo throws(function() use ($bulk) {
15+
$bulk->delete(['x' => 1], ['hint' => 1]);
1216
}, 'MongoDB\Driver\Exception\InvalidArgumentException'), "\n";
1317

1418
?>
@@ -17,4 +21,7 @@ echo throws(function() use ($bulk) {
1721
--EXPECTF--
1822
OK: Got MongoDB\Driver\Exception\InvalidArgumentException
1923
Expected "collation" option to be array or object, int%S given
24+
25+
OK: Got MongoDB\Driver\Exception\InvalidArgumentException
26+
Expected "hint" option to be string, array, or object, int%S given
2027
===DONE===
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
MongoDB\Driver\BulkWrite::delete() hint option requires MongoDB 4.4 (server-side error)
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_live(); ?>
6+
<?php skip_if_server_version('>=', '4.3.4'); ?>
7+
<?php skip_if_server_version('<=', '3.6.0'); ?>
8+
--FILE--
9+
<?php
10+
require_once __DIR__ . "/../utils/basic.inc";
11+
12+
$manager = new MongoDB\Driver\Manager(URI);
13+
14+
$bulk = new MongoDB\Driver\BulkWrite;
15+
$bulk->delete(['_id' => 1], ['hint' => '_id_']);
16+
17+
echo throws(function() use ($manager, $bulk) {
18+
$manager->executeBulkWrite(NS, $bulk);
19+
}, 'MongoDB\Driver\Exception\BulkWriteException'), "\n";
20+
21+
?>
22+
===DONE===
23+
<?php exit(0); ?>
24+
--EXPECT--
25+
OK: Got MongoDB\Driver\Exception\BulkWriteException
26+
BSON field 'delete.deletes.hint' is an unknown field.
27+
===DONE===

0 commit comments

Comments
 (0)