Skip to content

Commit eddcd4b

Browse files
committed
PHPC-1154: Implement wild card syntax for typemap field paths
1 parent bdda892 commit eddcd4b

File tree

3 files changed

+277
-0
lines changed

3 files changed

+277
-0
lines changed

src/bson.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,9 @@ static bool map_element_matches_field_path(php_phongo_field_path_map_element* ma
804804
return false;
805805
}
806806
for (i = 0; i < current->size; i++) {
807+
if (strcmp(map_element->entry->elements[i], "$") == 0) {
808+
continue;
809+
}
807810
if (strcmp(map_element->entry->elements[i], current->elements[i]) != 0) {
808811
return false;
809812
}

tests/bson/typemap-006.phpt

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
--TEST--
2+
MongoDB\Driver\Cursor::setTypeMap(): Setting fieldPath typemaps for compound types with wild card keys
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php NEEDS('STANDALONE'); CLEANUP(STANDALONE); ?>
6+
--FILE--
7+
<?php
8+
9+
require_once __DIR__ . "/../utils/basic.inc";
10+
11+
class MyArrayObject extends ArrayObject implements MongoDB\BSON\Unserializable
12+
{
13+
function bsonUnserialize(array $data)
14+
{
15+
parent::__construct($data, ArrayObject::ARRAY_AS_PROPS);
16+
}
17+
}
18+
19+
class MyWildCardArrayObject extends MyArrayObject {};
20+
21+
$manager = new MongoDB\Driver\Manager(STANDALONE);
22+
23+
$document = [
24+
'_id' => 1,
25+
'array' => [0 => [ 4, 5, 6 ], 1 => [ 7, 8, 9 ]],
26+
'object' => ['one' => [ 4, 5, 6 ], 'two' => [ 7, 8, 9 ]],
27+
];
28+
29+
$bulk = new MongoDB\Driver\BulkWrite();
30+
$bulk->insert($document);
31+
$manager->executeBulkWrite(NS, $bulk);
32+
33+
function fetch($manager, $typemap = []) {
34+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
35+
if ($typemap) {
36+
$cursor->setTypeMap($typemap);
37+
}
38+
39+
$documents = $cursor->toArray();
40+
return $documents;
41+
}
42+
43+
44+
echo "\nSetting 'array.$' path to 'MyWildCardArrayObject'\n";
45+
$documents = fetch($manager, ["fieldPaths" => [
46+
'array.$' => "MyWildCardArrayObject"
47+
]]);
48+
var_dump($documents[0] instanceof stdClass);
49+
var_dump(is_array($documents[0]->array));
50+
var_dump($documents[0]->array[0] instanceof MyWildCardArrayObject);
51+
var_dump($documents[0]->array[1] instanceof MyWildCardArrayObject);
52+
53+
echo "\nSetting 'array.1' to 'MyArrayObject' and 'array.$' path to 'MyWildCardArrayObject'\n";
54+
$documents = fetch($manager, ["fieldPaths" => [
55+
'array.1' => "MyArrayObject",
56+
'array.$' => "MyWildCardArrayObject"
57+
]]);
58+
var_dump($documents[0] instanceof stdClass);
59+
var_dump(is_array($documents[0]->array));
60+
var_dump($documents[0]->array[0] instanceof MyWildCardArrayObject);
61+
var_dump($documents[0]->array[1] instanceof MyArrayObject);
62+
63+
echo "\nSetting 'array.$' to 'MyWildCardArrayObject' and 'array.1' path to 'MyArrayObject'\n";
64+
$documents = fetch($manager, ["fieldPaths" => [
65+
'array.$' => "MyWildCardArrayObject",
66+
'array.1' => "MyArrayObject"
67+
]]);
68+
var_dump($documents[0] instanceof stdClass);
69+
var_dump(is_array($documents[0]->array));
70+
var_dump($documents[0]->array[0] instanceof MyWildCardArrayObject);
71+
var_dump($documents[0]->array[1] instanceof MyArrayObject);
72+
73+
74+
echo "\nSetting 'object.$' path to 'MyWildCardArrayObject'\n";
75+
$documents = fetch($manager, ["fieldPaths" => [
76+
'object.$' => "MyWildCardArrayObject"
77+
]]);
78+
var_dump($documents[0] instanceof stdClass);
79+
var_dump(is_object($documents[0]->object));
80+
var_dump($documents[0]->object->one instanceof MyWildCardArrayObject);
81+
var_dump($documents[0]->object->two instanceof MyWildCardArrayObject);
82+
83+
echo "\nSetting 'object.two' to 'MyArrayObject' and 'object.$' path to 'MyWildCardArrayObject'\n";
84+
$documents = fetch($manager, ["fieldPaths" => [
85+
'object.two' => "MyArrayObject",
86+
'object.$' => "MyWildCardArrayObject"
87+
]]);
88+
var_dump($documents[0] instanceof stdClass);
89+
var_dump(is_object($documents[0]->object));
90+
var_dump($documents[0]->object->one instanceof MyWildCardArrayObject);
91+
var_dump($documents[0]->object->two instanceof MyArrayObject);
92+
93+
echo "\nSetting 'object.$' to 'MyWildCardArrayObject' and 'object.one' path to 'MyArrayObject'\n";
94+
$documents = fetch($manager, ["fieldPaths" => [
95+
'object.$' => "MyWildCardArrayObject",
96+
'object.one' => "MyArrayObject"
97+
]]);
98+
var_dump($documents[0] instanceof stdClass);
99+
var_dump(is_object($documents[0]->object));
100+
var_dump($documents[0]->object->one instanceof MyArrayObject);
101+
var_dump($documents[0]->object->two instanceof MyWildCardArrayObject);
102+
?>
103+
===DONE===
104+
<?php exit(0); ?>
105+
--EXPECT--
106+
Setting 'array.$' path to 'MyWildCardArrayObject'
107+
bool(true)
108+
bool(true)
109+
bool(true)
110+
bool(true)
111+
112+
Setting 'array.1' to 'MyArrayObject' and 'array.$' path to 'MyWildCardArrayObject'
113+
bool(true)
114+
bool(true)
115+
bool(true)
116+
bool(true)
117+
118+
Setting 'array.$' to 'MyWildCardArrayObject' and 'array.1' path to 'MyArrayObject'
119+
bool(true)
120+
bool(true)
121+
bool(true)
122+
bool(true)
123+
124+
Setting 'object.$' path to 'MyWildCardArrayObject'
125+
bool(true)
126+
bool(true)
127+
bool(true)
128+
bool(true)
129+
130+
Setting 'object.two' to 'MyArrayObject' and 'object.$' path to 'MyWildCardArrayObject'
131+
bool(true)
132+
bool(true)
133+
bool(true)
134+
bool(true)
135+
136+
Setting 'object.$' to 'MyWildCardArrayObject' and 'object.one' path to 'MyArrayObject'
137+
bool(true)
138+
bool(true)
139+
bool(true)
140+
bool(true)
141+
===DONE===

tests/bson/typemap-007.phpt

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
--TEST--
2+
MongoDB\Driver\Cursor::setTypeMap(): Setting fieldPath typemaps for compound types with wild card keys (nested)
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php NEEDS('STANDALONE'); CLEANUP(STANDALONE); ?>
6+
--FILE--
7+
<?php
8+
9+
require_once __DIR__ . "/../utils/basic.inc";
10+
11+
class MyArrayObject extends ArrayObject implements MongoDB\BSON\Unserializable
12+
{
13+
function bsonUnserialize(array $data)
14+
{
15+
parent::__construct($data, ArrayObject::ARRAY_AS_PROPS);
16+
}
17+
}
18+
19+
class MyWildCardArrayObject extends MyArrayObject {};
20+
21+
$manager = new MongoDB\Driver\Manager(STANDALONE);
22+
23+
$document = [
24+
'_id' => 1,
25+
'object' => [
26+
'parent1' => [
27+
'child1' => [ 1, 2, 3 ],
28+
'child2' => [ 4, 5, 6 ],
29+
],
30+
'parent2' => [
31+
'child1' => [ 7, 8, 9 ],
32+
'child2' => [ 10, 11, 12 ],
33+
],
34+
],
35+
];
36+
37+
$bulk = new MongoDB\Driver\BulkWrite();
38+
$bulk->insert($document);
39+
$manager->executeBulkWrite(NS, $bulk);
40+
41+
function fetch($manager, $typemap = []) {
42+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
43+
if ($typemap) {
44+
$cursor->setTypeMap($typemap);
45+
}
46+
47+
$documents = $cursor->toArray();
48+
return $documents;
49+
}
50+
51+
52+
echo "\nSetting 'object.$.child1' path to 'MyWildCardArrayObject'\n";
53+
$documents = fetch($manager, ["fieldPaths" => [
54+
'object.$.child1' => "MyWildCardArrayObject"
55+
]]);
56+
var_dump($documents[0]->object->parent1 instanceof stdClass);
57+
var_dump($documents[0]->object->parent1->child1 instanceof MyWildCardArrayObject);
58+
var_dump(is_array($documents[0]->object->parent1->child2));
59+
var_dump($documents[0]->object->parent2 instanceof stdClass);
60+
var_dump($documents[0]->object->parent2->child1 instanceof MyWildCardArrayObject);
61+
var_dump(is_array($documents[0]->object->parent2->child2));
62+
63+
echo "\nSetting 'object.parent1.$' path to 'MyWildCardArrayObject' and 'object.parent2.child1' to 'MyArrayObject'\n";
64+
$documents = fetch($manager, ["fieldPaths" => [
65+
'object.parent1.$' => "MyWildCardArrayObject",
66+
'object.parent2.child1' => "MyArrayObject",
67+
]]);
68+
var_dump($documents[0]->object->parent1 instanceof stdClass);
69+
var_dump($documents[0]->object->parent1->child1 instanceof MyWildCardArrayObject);
70+
var_dump($documents[0]->object->parent1->child2 instanceof MyWildCardArrayObject);
71+
var_dump($documents[0]->object->parent2 instanceof stdClass);
72+
var_dump($documents[0]->object->parent2->child1 instanceof MyArrayObject);
73+
var_dump(is_array($documents[0]->object->parent2->child2));
74+
75+
echo "\nSetting 'object.parent1.$' path to 'MyWildCardArrayObject' and 'object.$.$' to 'MyArrayObject'\n";
76+
$documents = fetch($manager, ["fieldPaths" => [
77+
'object.parent1.$' => "MyWildCardArrayObject",
78+
'object.$.$' => "MyArrayObject",
79+
]]);
80+
var_dump($documents[0]->object->parent1 instanceof stdClass);
81+
var_dump($documents[0]->object->parent1->child1 instanceof MyWildCardArrayObject);
82+
var_dump($documents[0]->object->parent1->child2 instanceof MyWildCardArrayObject);
83+
var_dump($documents[0]->object->parent2 instanceof stdClass);
84+
var_dump($documents[0]->object->parent2->child1 instanceof MyArrayObject);
85+
var_dump($documents[0]->object->parent2->child2 instanceof MyArrayObject);
86+
87+
echo "\nSetting 'object.parent1.$' path to 'MyWildCardArrayObject' and 'object.$.child2' to 'MyArrayObject'\n";
88+
$documents = fetch($manager, ["fieldPaths" => [
89+
'object.parent1.child1' => "MyWildCardArrayObject",
90+
'object.$.child2' => "MyArrayObject",
91+
]]);
92+
var_dump($documents[0]->object->parent1 instanceof stdClass);
93+
var_dump($documents[0]->object->parent1->child1 instanceof MyWildCardArrayObject);
94+
var_dump($documents[0]->object->parent1->child2 instanceof MyArrayObject);
95+
var_dump($documents[0]->object->parent2 instanceof stdClass);
96+
var_dump(is_array($documents[0]->object->parent2->child1));
97+
var_dump($documents[0]->object->parent2->child2 instanceof MyArrayObject);
98+
?>
99+
===DONE===
100+
<?php exit(0); ?>
101+
--EXPECT--
102+
Setting 'object.$.child1' path to 'MyWildCardArrayObject'
103+
bool(true)
104+
bool(true)
105+
bool(true)
106+
bool(true)
107+
bool(true)
108+
bool(true)
109+
110+
Setting 'object.parent1.$' path to 'MyWildCardArrayObject' and 'object.parent2.child1' to 'MyArrayObject'
111+
bool(true)
112+
bool(true)
113+
bool(true)
114+
bool(true)
115+
bool(true)
116+
bool(true)
117+
118+
Setting 'object.parent1.$' path to 'MyWildCardArrayObject' and 'object.$.$' to 'MyArrayObject'
119+
bool(true)
120+
bool(true)
121+
bool(true)
122+
bool(true)
123+
bool(true)
124+
bool(true)
125+
126+
Setting 'object.parent1.$' path to 'MyWildCardArrayObject' and 'object.$.child2' to 'MyArrayObject'
127+
bool(true)
128+
bool(true)
129+
bool(true)
130+
bool(true)
131+
bool(true)
132+
bool(true)
133+
===DONE===

0 commit comments

Comments
 (0)