Completed
Push — migrate-files-no-interaction ( 025687...608925 )
by
unknown
46:43 queued 18:48
created

HandlerLocationTest::getConverterRegistry()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 19
Code Lines 13

Duplication

Lines 19
Ratio 100 %

Importance

Changes 0
Metric Value
cc 2
eloc 13
nc 2
nop 0
dl 19
loc 19
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * This file is part of the eZ Publish Kernel package.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 */
9
namespace eZ\Publish\Core\Search\Legacy\Tests\Content\Location;
10
11
use eZ\Publish\Core\Persistence\Legacy\Tests\Content\LanguageAwareTestCase;
12
use eZ\Publish\Core\Persistence;
13
use eZ\Publish\Core\Search\Legacy\Content;
14
use eZ\Publish\Core\Search\Legacy\Content\Common\Gateway\CriteriaConverter;
15
use eZ\Publish\Core\Search\Legacy\Content\Common\Gateway\SortClauseConverter;
16
use eZ\Publish\SPI\Persistence\Content\Location as SPILocation;
17
use eZ\Publish\API\Repository\Values\Content\LocationQuery;
18
use eZ\Publish\API\Repository\Values\Content\Query\Criterion;
19
use eZ\Publish\API\Repository\Values\Content\Query\SortClause;
20
use eZ\Publish\Core\Search\Legacy\Content\Location\Gateway\CriterionHandler as LocationCriterionHandler;
21
use eZ\Publish\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler as CommonCriterionHandler;
22
use eZ\Publish\Core\Search\Legacy\Content\Location\Gateway\SortClauseHandler as LocationSortClauseHandler;
23
use eZ\Publish\Core\Search\Legacy\Content\Common\Gateway\SortClauseHandler as CommonSortClauseHandler;
24
use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter;
25
use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry;
26
use eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\DoctrineDatabase as ContentTypeGateway;
27
use eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper as ContentTypeMapper;
28
use eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler as ContentTypeHandler;
29
use eZ\Publish\Core\Search\Legacy\Content\Gateway as ContentGateway;
30
use eZ\Publish\Core\Persistence\Legacy\Content\Mapper as ContentMapper;
31
use eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler as ContentTypeUpdateHandler;
32
use eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper as LocationMapper;
33
34
/**
35
 * Location Search test case for ContentSearchHandler.
36
 */
37
class HandlerLocationTest extends LanguageAwareTestCase
38
{
39
    protected static $setUp = false;
40
41
    /**
42
     * Only set up once for these read only tests on a large fixture.
43
     *
44
     * Skipping the reset-up, since setting up for these tests takes quite some
45
     * time, which is not required to spent, since we are only reading from the
46
     * database anyways.
47
     */
48 View Code Duplication
    public function setUp()
49
    {
50
        if (!self::$setUp) {
51
            parent::setUp();
52
            $this->insertDatabaseFixture(__DIR__ . '/../_fixtures/full_dump.php');
53
            self::$setUp = $this->handler;
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->handler of type object<eZ\Publish\Core\P...tabase\DatabaseHandler> is incompatible with the declared type boolean of property $setUp.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
54
        } else {
55
            $this->handler = self::$setUp;
0 ignored issues
show
Documentation Bug introduced by
It seems like self::$setUp of type boolean is incompatible with the declared type object<eZ\Publish\Core\P...tabase\DatabaseHandler> of property $handler.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
56
        }
57
    }
58
59
    /**
60
     * Assert that the elements are.
61
     */
62 View Code Duplication
    protected function assertSearchResults($expectedIds, $searchResult)
63
    {
64
        $ids = array_map(
65
            function ($hit) {
66
                return $hit->valueObject->id;
67
            },
68
            $searchResult->searchHits
69
        );
70
71
        sort($ids);
72
73
        $this->assertEquals($expectedIds, $ids);
74
    }
75
76
    /**
77
     * Returns the location search handler to test.
78
     *
79
     * This method returns a fully functional search handler to perform tests on.
80
     *
81
     * @param array $fullTextSearchConfiguration
82
     *
83
     * @return \eZ\Publish\Core\Search\Legacy\Content\Handler
84
     */
85
    protected function getContentSearchHandler(array $fullTextSearchConfiguration = array())
86
    {
87
        $transformationProcessor = new Persistence\TransformationProcessor\DefinitionBased(
88
            new Persistence\TransformationProcessor\DefinitionBased\Parser(),
89
            new Persistence\TransformationProcessor\PcreCompiler(
90
                new Persistence\Utf8Converter()
91
            ),
92
            glob(__DIR__ . '/../../../../Persistence/Tests/TransformationProcessor/_fixtures/transformations/*.tr')
93
        );
94
        $commaSeparatedCollectionValueHandler = new CommonCriterionHandler\FieldValue\Handler\Collection(
95
            $this->getDatabaseHandler(),
96
            $transformationProcessor,
97
            ','
98
        );
99
        $hyphenSeparatedCollectionValueHandler = new CommonCriterionHandler\FieldValue\Handler\Collection(
100
            $this->getDatabaseHandler(),
101
            $transformationProcessor,
102
            '-'
103
        );
104
        $simpleValueHandler = new CommonCriterionHandler\FieldValue\Handler\Simple(
105
            $this->getDatabaseHandler(),
106
            $transformationProcessor
107
        );
108
        $compositeValueHandler = new CommonCriterionHandler\FieldValue\Handler\Composite(
109
            $this->getDatabaseHandler(),
110
            $transformationProcessor
111
        );
112
113
        return new Content\Handler(
114
            $this->createMock(ContentGateway::class),
115
            new Content\Location\Gateway\DoctrineDatabase(
116
                $this->getDatabaseHandler(),
117
                new CriteriaConverter(
118
                    array(
119
                        new LocationCriterionHandler\LocationId($this->getDatabaseHandler()),
120
                        new LocationCriterionHandler\ParentLocationId($this->getDatabaseHandler()),
121
                        new LocationCriterionHandler\LocationRemoteId($this->getDatabaseHandler()),
122
                        new LocationCriterionHandler\Subtree($this->getDatabaseHandler()),
123
                        new LocationCriterionHandler\Visibility($this->getDatabaseHandler()),
124
                        new LocationCriterionHandler\Location\Depth($this->getDatabaseHandler()),
125
                        new LocationCriterionHandler\Location\Priority($this->getDatabaseHandler()),
126
                        new LocationCriterionHandler\Location\IsMainLocation($this->getDatabaseHandler()),
127
                        new CommonCriterionHandler\ContentId($this->getDatabaseHandler()),
128
                        new CommonCriterionHandler\ContentTypeGroupId($this->getDatabaseHandler()),
129
                        new CommonCriterionHandler\ContentTypeId($this->getDatabaseHandler()),
130
                        new CommonCriterionHandler\ContentTypeIdentifier(
131
                            $this->getDatabaseHandler(),
132
                            $this->getContentTypeHandler()
133
                        ),
134
                        new CommonCriterionHandler\DateMetadata($this->getDatabaseHandler()),
135
                        new CommonCriterionHandler\Field(
136
                            $this->getDatabaseHandler(),
137
                            $this->getContentTypeHandler(),
138
                            $this->getLanguageHandler(),
139
                            $this->getConverterRegistry(),
140
                            new CommonCriterionHandler\FieldValue\Converter(
141
                                new CommonCriterionHandler\FieldValue\HandlerRegistry(
142
                                    array(
143
                                        'ezboolean' => $simpleValueHandler,
144
                                        'ezcountry' => $commaSeparatedCollectionValueHandler,
145
                                        'ezdate' => $simpleValueHandler,
146
                                        'ezdatetime' => $simpleValueHandler,
147
                                        'ezemail' => $simpleValueHandler,
148
                                        'ezinteger' => $simpleValueHandler,
149
                                        'ezobjectrelation' => $simpleValueHandler,
150
                                        'ezobjectrelationlist' => $commaSeparatedCollectionValueHandler,
151
                                        'ezselection' => $hyphenSeparatedCollectionValueHandler,
152
                                        'eztime' => $simpleValueHandler,
153
                                    )
154
                                ),
155
                                $compositeValueHandler
156
                            ),
157
                            $transformationProcessor
158
                        ),
159
                        new CommonCriterionHandler\FullText(
160
                            $this->getDatabaseHandler(),
161
                            $transformationProcessor,
162
                            $fullTextSearchConfiguration
163
                        ),
164
                        new CommonCriterionHandler\LanguageCode(
165
                            $this->getDatabaseHandler(),
166
                            $this->getLanguageMaskGenerator()
167
                        ),
168
                        new CommonCriterionHandler\LogicalAnd($this->getDatabaseHandler()),
169
                        new CommonCriterionHandler\LogicalNot($this->getDatabaseHandler()),
170
                        new CommonCriterionHandler\LogicalOr($this->getDatabaseHandler()),
171
                        new CommonCriterionHandler\MapLocationDistance(
172
                            $this->getDatabaseHandler(),
173
                            $this->getContentTypeHandler(),
174
                            $this->getLanguageHandler()
175
                        ),
176
                        new CommonCriterionHandler\MatchAll($this->getDatabaseHandler()),
177
                        new CommonCriterionHandler\ObjectStateId($this->getDatabaseHandler()),
178
                        new CommonCriterionHandler\FieldRelation(
179
                            $this->getDatabaseHandler(),
180
                            $this->getContentTypeHandler(),
181
                            $this->getLanguageHandler()
182
                        ),
183
                        new CommonCriterionHandler\RemoteId($this->getDatabaseHandler()),
184
                        new CommonCriterionHandler\SectionId($this->getDatabaseHandler()),
185
                        new CommonCriterionHandler\UserMetadata($this->getDatabaseHandler()),
186
                    )
187
                ),
188
                new SortClauseConverter(
189
                    array(
190
                        new LocationSortClauseHandler\Location\Id($this->getDatabaseHandler()),
191
                        new CommonSortClauseHandler\ContentId($this->getDatabaseHandler()),
192
                    )
193
                ),
194
                $this->getLanguageHandler()
195
            ),
196
            new Content\WordIndexer\Gateway\DoctrineDatabase(
197
                $this->getDatabaseHandler(),
198
                $this->getContentTypeHandler(),
199
                $transformationProcessor,
200
                new Content\WordIndexer\Repository\SearchIndex($this->getDatabaseHandler()),
201
                $this->getFullTextSearchConfiguration()
202
            ),
203
            $this->createMock(ContentMapper::class),
204
            $this->getLocationMapperMock(),
205
            $this->getLanguageHandler(),
206
            $this->getFullTextMapper($this->getContentTypeHandler())
207
        );
208
    }
209
210
    protected $contentTypeHandler;
211
212
    protected function getContentTypeHandler()
213
    {
214
        if (!isset($this->contentTypeHandler)) {
215
            $this->contentTypeHandler = new ContentTypeHandler(
216
                new ContentTypeGateway(
217
                    $this->getDatabaseHandler(),
218
                    $this->getLanguageMaskGenerator()
219
                ),
220
                new ContentTypeMapper($this->getConverterRegistry()),
221
                $this->createMock(ContentTypeUpdateHandler::class)
222
            );
223
        }
224
225
        return $this->contentTypeHandler;
226
    }
227
228
    protected $fieldRegistry;
229
230 View Code Duplication
    protected function getConverterRegistry()
231
    {
232
        if (!isset($this->fieldRegistry)) {
233
            $this->fieldRegistry = new ConverterRegistry(
234
                array(
235
                    'ezdatetime' => new Converter\DateAndTimeConverter(),
236
                    'ezinteger' => new Converter\IntegerConverter(),
237
                    'ezstring' => new Converter\TextLineConverter(),
238
                    'ezprice' => new Converter\IntegerConverter(),
239
                    'ezurl' => new Converter\UrlConverter(),
240
                    'ezrichtext' => new Converter\RichTextConverter(),
241
                    'ezboolean' => new Converter\CheckboxConverter(),
242
                    'ezkeyword' => new Converter\KeywordConverter(),
243
                )
244
            );
245
        }
246
247
        return $this->fieldRegistry;
248
    }
249
250
    /**
251
     * Returns a location mapper mock.
252
     *
253
     * @return \eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper
254
     */
255 View Code Duplication
    protected function getLocationMapperMock()
256
    {
257
        $mapperMock = $this->getMockBuilder(LocationMapper::class)
258
            ->setMethods(array('createLocationsFromRows'))
259
            ->getMock();
260
        $mapperMock
261
            ->expects($this->any())
262
            ->method('createLocationsFromRows')
263
            ->with($this->isType('array'))
264
            ->will(
265
                $this->returnCallback(
266
                    function ($rows) {
267
                        $locations = array();
268
                        foreach ($rows as $row) {
269
                            $locationId = (int)$row['node_id'];
270
                            if (!isset($locations[$locationId])) {
271
                                $locations[$locationId] = new SPILocation();
272
                                $locations[$locationId]->id = $locationId;
273
                            }
274
                        }
275
276
                        return array_values($locations);
277
                    }
278
                )
279
            );
280
281
        return $mapperMock;
282
    }
283
284
    public function testFindWithoutOffsetLimit()
285
    {
286
        $handler = $this->getContentSearchHandler();
287
288
        $searchResult = $handler->findLocations(
289
            new LocationQuery(
290
                array(
291
                    'filter' => new Criterion\LocationId(2),
292
                )
293
            )
294
        );
295
296
        $this->assertEquals(1, $searchResult->totalCount);
297
        $this->assertCount(1, $searchResult->searchHits);
298
    }
299
300
    public function testFindWithZeroLimit()
301
    {
302
        $handler = $this->getContentSearchHandler();
303
304
        $searchResult = $handler->findLocations(
305
            new LocationQuery(
306
                array(
307
                    'filter' => new Criterion\LocationId(2),
308
                    'offset' => 0,
309
                    'limit' => 0,
310
                )
311
            )
312
        );
313
314
        $this->assertEquals(1, $searchResult->totalCount);
315
        $this->assertEquals(array(), $searchResult->searchHits);
316
    }
317
318
    /**
319
     * Issue with PHP_MAX_INT limit overflow in databases.
320
     */
321
    public function testFindWithNullLimit()
322
    {
323
        $handler = $this->getContentSearchHandler();
324
325
        $searchResult = $handler->findLocations(
326
            new LocationQuery(
327
                array(
328
                    'filter' => new Criterion\LocationId(2),
329
                    'offset' => 0,
330
                    'limit' => null,
331
                )
332
            )
333
        );
334
335
        $this->assertEquals(1, $searchResult->totalCount);
336
        $this->assertCount(1, $searchResult->searchHits);
337
    }
338
339
    /**
340
     * Issue with offsetting to the nonexistent results produces \ezcQueryInvalidParameterException exception.
341
     */
342
    public function testFindWithOffsetToNonexistent()
343
    {
344
        $handler = $this->getContentSearchHandler();
345
346
        $searchResult = $handler->findLocations(
347
            new LocationQuery(
348
                array(
349
                    'filter' => new Criterion\LocationId(2),
350
                    'offset' => 1000,
351
                    'limit' => null,
352
                )
353
            )
354
        );
355
356
        $this->assertEquals(1, $searchResult->totalCount);
357
        $this->assertEquals(array(), $searchResult->searchHits);
358
    }
359
360
    public function testLocationIdFilter()
361
    {
362
        $this->assertSearchResults(
363
            array(12, 13),
364
            $this->getContentSearchHandler()->findLocations(
365
                new LocationQuery(
366
                    array(
367
                        'filter' => new Criterion\LocationId(
368
                            array(4, 12, 13)
369
                        ),
370
                        'limit' => 10,
371
                    )
372
                )
373
            )
374
        );
375
    }
376
377
    public function testParentLocationIdFilter()
378
    {
379
        $this->assertSearchResults(
380
            array(12, 13, 14, 44, 227),
381
            $this->getContentSearchHandler()->findLocations(
382
                new LocationQuery(
383
                    array(
384
                        'filter' => new Criterion\ParentLocationId(5),
385
                        'limit' => 10,
386
                    )
387
                )
388
            )
389
        );
390
    }
391
392 View Code Duplication
    public function testLocationIdAndCombinatorFilter()
393
    {
394
        $this->assertSearchResults(
395
            array(13),
396
            $this->getContentSearchHandler()->findLocations(
397
                new LocationQuery(
398
                    array(
399
                        'filter' => new Criterion\LogicalAnd(
400
                            array(
401
                                new Criterion\LocationId(
402
                                    array(4, 12, 13)
403
                                ),
404
                                new Criterion\LocationId(
405
                                    array(13, 44)
406
                                ),
407
                            )
408
                        ),
409
                        'limit' => 10,
410
                    )
411
                )
412
            )
413
        );
414
    }
415
416 View Code Duplication
    public function testLocationIdParentLocationIdAndCombinatorFilter()
417
    {
418
        $this->assertSearchResults(
419
            array(44, 160),
420
            $this->getContentSearchHandler()->findLocations(
421
                new LocationQuery(
422
                    array(
423
                        'filter' => new Criterion\LogicalAnd(
424
                            array(
425
                                new Criterion\LocationId(
426
                                    array(2, 44, 160, 166)
427
                                ),
428
                                new Criterion\ParentLocationId(
429
                                    array(5, 156)
430
                                ),
431
                            )
432
                        ),
433
                        'limit' => 10,
434
                    )
435
                )
436
            )
437
        );
438
    }
439
440
    public function testContentDepthFilterEq()
441
    {
442
        $this->assertSearchResults(
443
            array(2, 5, 43, 48, 58),
444
            $this->getContentSearchHandler()->findLocations(
445
                new LocationQuery(
446
                    array(
447
                        'filter' => new Criterion\Location\Depth(Criterion\Operator::EQ, 1),
448
                        'limit' => 10,
449
                    )
450
                )
451
            )
452
        );
453
    }
454
455 View Code Duplication
    public function testContentDepthFilterIn()
456
    {
457
        $this->assertSearchResults(
458
            array(2, 5, 12, 13, 14, 43, 44, 48, 51, 52, 53, 54, 56, 58, 59, 69, 77, 86, 96, 107, 153, 156, 167, 190, 227),
459
            $this->getContentSearchHandler()->findLocations(
460
                new LocationQuery(
461
                    array(
462
                        'filter' => new Criterion\Location\Depth(Criterion\Operator::IN, array(1, 2)),
463
                        'limit' => 50,
464
                    )
465
                )
466
            )
467
        );
468
    }
469
470
    public function testContentDepthFilterBetween()
471
    {
472
        $this->assertSearchResults(
473
            array(2, 5, 43, 48, 58),
474
            $this->getContentSearchHandler()->findLocations(
475
                new LocationQuery(
476
                    array(
477
                        'filter' => new Criterion\Location\Depth(Criterion\Operator::BETWEEN, array(0, 1)),
478
                    )
479
                )
480
            )
481
        );
482
    }
483
484 View Code Duplication
    public function testContentDepthFilterGreaterThan()
485
    {
486
        $this->assertSearchResults(
487
            array(99, 102, 135, 136, 137, 139, 140, 142, 143, 144, 145, 148, 151, 174, 175, 177, 194, 196, 197, 198, 199, 200, 201, 202, 203, 205, 206, 207, 208, 209, 210, 211, 212, 214, 215),
488
            $this->getContentSearchHandler()->findLocations(
489
                new LocationQuery(
490
                    array(
491
                        'filter' => new Criterion\Location\Depth(Criterion\Operator::GT, 4),
492
                        'limit' => 50,
493
                    )
494
                )
495
            )
496
        );
497
    }
498
499 View Code Duplication
    public function testContentDepthFilterGreaterThanOrEqual()
500
    {
501
        $this->assertSearchResults(
502
            array(99, 102, 135, 136, 137, 139, 140, 142, 143, 144, 145, 148, 151, 174, 175, 177, 194, 196, 197, 198, 199, 200, 201, 202, 203, 205, 206, 207, 208, 209, 210, 211, 212, 214, 215),
503
            $this->getContentSearchHandler()->findLocations(
504
                new LocationQuery(
505
                    array(
506
                        'filter' => new Criterion\Location\Depth(Criterion\Operator::GTE, 5),
507
                        'limit' => 50,
508
                    )
509
                )
510
            )
511
        );
512
    }
513
514
    public function testContentDepthFilterLessThan()
515
    {
516
        $this->assertSearchResults(
517
            array(2, 5, 43, 48, 58),
518
            $this->getContentSearchHandler()->findLocations(
519
                new LocationQuery(
520
                    array(
521
                        'filter' => new Criterion\Location\Depth(Criterion\Operator::LT, 2),
522
                        'limit' => 10,
523
                    )
524
                )
525
            )
526
        );
527
    }
528
529 View Code Duplication
    public function testContentDepthFilterLessThanOrEqual()
530
    {
531
        $this->assertSearchResults(
532
            array(2, 5, 12, 13, 14, 43, 44, 48, 51, 52, 53, 54, 56, 58, 59, 69, 77, 86, 96, 107, 153, 156, 167, 190, 227),
533
            $this->getContentSearchHandler()->findLocations(
534
                new LocationQuery(
535
                    array(
536
                        'filter' => new Criterion\Location\Depth(Criterion\Operator::LTE, 2),
537
                        'limit' => 50,
538
                    )
539
                )
540
            )
541
        );
542
    }
543
544
    public function testLocationPriorityFilter()
545
    {
546
        $this->assertSearchResults(
547
            array(156, 167, 190),
548
            $this->getContentSearchHandler()->findLocations(
549
                new LocationQuery(
550
                    array(
551
                        'filter' => new Criterion\Location\Priority(
552
                            Criterion\Operator::BETWEEN,
553
                            array(1, 10)
554
                        ),
555
                        'limit' => 10,
556
                    )
557
                )
558
            )
559
        );
560
    }
561
562
    public function testLocationRemoteIdFilter()
563
    {
564
        $this->assertSearchResults(
565
            array(2, 5),
566
            $this->getContentSearchHandler()->findLocations(
567
                new LocationQuery(
568
                    array(
569
                        'filter' => new Criterion\LocationRemoteId(
570
                            array('3f6d92f8044aed134f32153517850f5a', 'f3e90596361e31d496d4026eb624c983')
571
                        ),
572
                        'limit' => 10,
573
                    )
574
                )
575
            )
576
        );
577
    }
578
579 View Code Duplication
    public function testVisibilityFilterVisible()
580
    {
581
        $this->assertSearchResults(
582
            array(2, 5, 12, 13, 14),
583
            $this->getContentSearchHandler()->findLocations(
584
                new LocationQuery(
585
                    array(
586
                        'filter' => new Criterion\Visibility(
587
                            Criterion\Visibility::VISIBLE
588
                        ),
589
                        'limit' => 5,
590
                        'sortClauses' => array(new SortClause\Location\Id()),
591
                    )
592
                )
593
            )
594
        );
595
    }
596
597
    public function testVisibilityFilterHidden()
598
    {
599
        $this->assertSearchResults(
600
            array(228),
601
            $this->getContentSearchHandler()->findLocations(
602
                new LocationQuery(
603
                    array(
604
                        'filter' => new Criterion\Visibility(
605
                            Criterion\Visibility::HIDDEN
606
                        ),
607
                    )
608
                )
609
            )
610
        );
611
    }
612
613 View Code Duplication
    public function testLocationNotCombinatorFilter()
614
    {
615
        $this->assertSearchResults(
616
            array(2, 5),
617
            $this->getContentSearchHandler()->findLocations(
618
                new LocationQuery(
619
                    array(
620
                        'filter' => new Criterion\LogicalAnd(
621
                            array(
622
                                new Criterion\LocationId(
623
                                    array(2, 5, 12, 356)
624
                                ),
625
                                new Criterion\LogicalNot(
626
                                    new Criterion\LocationId(
627
                                        array(12, 13, 14)
628
                                    )
629
                                ),
630
                            )
631
                        ),
632
                        'limit' => 10,
633
                    )
634
                )
635
            )
636
        );
637
    }
638
639
    public function testLocationOrCombinatorFilter()
640
    {
641
        $this->assertSearchResults(
642
            array(2, 5, 12, 13, 14),
643
            $this->getContentSearchHandler()->findLocations(
644
                new LocationQuery(
645
                    array(
646
                        'filter' => new Criterion\LogicalOr(
647
                            array(
648
                                new Criterion\LocationId(
649
                                    array(2, 5, 12)
650
                                ),
651
                                new Criterion\LocationId(
652
                                    array(12, 13, 14)
653
                                ),
654
                            )
655
                        ),
656
                        'limit' => 10,
657
                    )
658
                )
659
            )
660
        );
661
    }
662
663
    public function testContentIdFilterEquals()
664
    {
665
        $this->assertSearchResults(
666
            array(225),
667
            $this->getContentSearchHandler()->findLocations(
668
                new LocationQuery(
669
                    array(
670
                        'filter' => new Criterion\ContentId(223),
671
                    )
672
                )
673
            )
674
        );
675
    }
676
677
    public function testContentIdFilterIn()
678
    {
679
        $this->assertSearchResults(
680
            array(225, 226, 227),
681
            $this->getContentSearchHandler()->findLocations(
682
                new LocationQuery(
683
                    array(
684
                        'filter' => new Criterion\ContentId(
685
                            array(223, 224, 225)
686
                        ),
687
                    )
688
                )
689
            )
690
        );
691
    }
692
693 View Code Duplication
    public function testContentTypeGroupFilter()
694
    {
695
        $this->assertSearchResults(
696
            array(5, 12, 13, 14, 15, 44, 45, 227, 228),
697
            $this->getContentSearchHandler()->findLocations(
698
                new LocationQuery(
699
                    array(
700
                        'filter' => new Criterion\ContentTypeGroupId(2),
701
                        'limit' => 10,
702
                    )
703
                )
704
            )
705
        );
706
    }
707
708
    public function testContentTypeIdFilter()
709
    {
710
        $this->assertSearchResults(
711
            array(15, 45, 228),
712
            $this->getContentSearchHandler()->findLocations(
713
                new LocationQuery(
714
                    array(
715
                        'filter' => new Criterion\ContentTypeId(4),
716
                        'limit' => 10,
717
                    )
718
                )
719
            )
720
        );
721
    }
722
723 View Code Duplication
    public function testContentTypeIdentifierFilter()
724
    {
725
        $this->assertSearchResults(
726
            array(43, 48, 51, 52, 53),
727
            $this->getContentSearchHandler()->findLocations(
728
                new LocationQuery(
729
                    array(
730
                        'filter' => new Criterion\ContentTypeIdentifier('folder'),
731
                        'limit' => 5,
732
                        'sortClauses' => array(new SortClause\Location\Id()),
733
                    )
734
                )
735
            )
736
        );
737
    }
738
739 View Code Duplication
    public function testObjectStateIdFilter()
740
    {
741
        $this->assertSearchResults(
742
            array(5, 12, 13, 14, 15, 43, 44, 45, 48, 51),
743
            $this->getContentSearchHandler()->findLocations(
744
                new LocationQuery(
745
                    array(
746
                        'filter' => new Criterion\ObjectStateId(1),
747
                        'limit' => 10,
748
                        'sortClauses' => array(new SortClause\ContentId()),
749
                    )
750
                )
751
            )
752
        );
753
    }
754
755
    public function testObjectStateIdFilterIn()
756
    {
757
        $this->assertSearchResults(
758
            array(2, 5, 12, 13, 14, 15, 43, 44, 45, 48),
759
            $this->getContentSearchHandler()->findLocations(
760
                new LocationQuery(
761
                    array(
762
                        'filter' => new Criterion\ObjectStateId(array(1, 2)),
763
                        'limit' => 10,
764
                        'sortClauses' => array(new SortClause\Location\Id()),
765
                    )
766
                )
767
            )
768
        );
769
    }
770
771
    public function testRemoteIdFilter()
772
    {
773
        $this->assertSearchResults(
774
            array(5, 45),
775
            $this->getContentSearchHandler()->findLocations(
776
                new LocationQuery(
777
                    array(
778
                        'filter' => new Criterion\RemoteId(
779
                            array('f5c88a2209584891056f987fd965b0ba', 'faaeb9be3bd98ed09f606fc16d144eca')
780
                        ),
781
                        'limit' => 10,
782
                    )
783
                )
784
            )
785
        );
786
    }
787
788 View Code Duplication
    public function testSectionFilter()
789
    {
790
        $this->assertSearchResults(
791
            array(5, 12, 13, 14, 15, 44, 45, 228),
792
            $this->getContentSearchHandler()->findLocations(
793
                new LocationQuery(
794
                    array(
795
                        'filter' => new Criterion\SectionId(array(2)),
796
                        'limit' => 10,
797
                    )
798
                )
799
            )
800
        );
801
    }
802
803
    public function testDateMetadataFilterModifiedGreater()
804
    {
805
        $this->assertSearchResults(
806
            array(12, 227, 228),
807
            $this->getContentSearchHandler()->findLocations(
808
                new LocationQuery(
809
                    array(
810
                        'filter' => new Criterion\DateMetadata(
811
                            Criterion\DateMetadata::MODIFIED,
812
                            Criterion\Operator::GT,
813
                            1311154214
814
                        ),
815
                        'limit' => 10,
816
                    )
817
                )
818
            )
819
        );
820
    }
821
822
    public function testDateMetadataFilterModifiedGreaterOrEqual()
823
    {
824
        $this->assertSearchResults(
825
            array(12, 15, 227, 228),
826
            $this->getContentSearchHandler()->findLocations(
827
                new LocationQuery(
828
                    array(
829
                        'filter' => new Criterion\DateMetadata(
830
                            Criterion\DateMetadata::MODIFIED,
831
                            Criterion\Operator::GTE,
832
                            1311154214
833
                        ),
834
                        'limit' => 10,
835
                    )
836
                )
837
            )
838
        );
839
    }
840
841 View Code Duplication
    public function testDateMetadataFilterModifiedIn()
842
    {
843
        $this->assertSearchResults(
844
            array(12, 15, 227, 228),
845
            $this->getContentSearchHandler()->findLocations(
846
                new LocationQuery(
847
                    array(
848
                        'filter' => new Criterion\DateMetadata(
849
                            Criterion\DateMetadata::MODIFIED,
850
                            Criterion\Operator::IN,
851
                            array(1311154214, 1311154215)
852
                        ),
853
                        'limit' => 10,
854
                    )
855
                )
856
            )
857
        );
858
    }
859
860 View Code Duplication
    public function testDateMetadataFilterModifiedBetween()
861
    {
862
        $this->assertSearchResults(
863
            array(12, 15, 227, 228),
864
            $this->getContentSearchHandler()->findLocations(
865
                new LocationQuery(
866
                    array(
867
                        'filter' => new Criterion\DateMetadata(
868
                            Criterion\DateMetadata::MODIFIED,
869
                            Criterion\Operator::BETWEEN,
870
                            array(1311154213, 1311154215)
871
                        ),
872
                        'limit' => 10,
873
                    )
874
                )
875
            )
876
        );
877
    }
878
879 View Code Duplication
    public function testDateMetadataFilterCreatedBetween()
880
    {
881
        $this->assertSearchResults(
882
            array(68, 133, 227),
883
            $this->getContentSearchHandler()->findLocations(
884
                new LocationQuery(
885
                    array(
886
                        'filter' => new Criterion\DateMetadata(
887
                            Criterion\DateMetadata::CREATED,
888
                            Criterion\Operator::BETWEEN,
889
                            array(1299780749, 1311154215)
890
                        ),
891
                        'limit' => 10,
892
                    )
893
                )
894
            )
895
        );
896
    }
897
898
    public function testUserMetadataFilterOwnerWrongUserId()
899
    {
900
        $this->assertSearchResults(
901
            array(),
902
            $this->getContentSearchHandler()->findLocations(
903
                new LocationQuery(
904
                    array(
905
                        'filter' => new Criterion\UserMetadata(
906
                            Criterion\UserMetadata::OWNER,
907
                            Criterion\Operator::EQ,
908
                            2
909
                        ),
910
                    )
911
                )
912
            )
913
        );
914
    }
915
916 View Code Duplication
    public function testUserMetadataFilterOwnerAdministrator()
917
    {
918
        $this->assertSearchResults(
919
            array(2, 5, 12, 13, 14, 15, 43, 44, 45, 48),
920
            $this->getContentSearchHandler()->findLocations(
921
                new LocationQuery(
922
                    array(
923
                        'filter' => new Criterion\UserMetadata(
924
                            Criterion\UserMetadata::OWNER,
925
                            Criterion\Operator::EQ,
926
                            14
927
                        ),
928
                        'limit' => 10,
929
                        'sortClauses' => array(new SortClause\Location\Id()),
930
                    )
931
                )
932
            )
933
        );
934
    }
935
936
    public function testUserMetadataFilterOwnerEqAMember()
937
    {
938
        $this->assertSearchResults(
939
            array(225),
940
            $this->getContentSearchHandler()->findLocations(
941
                new LocationQuery(
942
                    array(
943
                        'filter' => new Criterion\UserMetadata(
944
                            Criterion\UserMetadata::OWNER,
945
                            Criterion\Operator::EQ,
946
                            226
947
                        ),
948
                    )
949
                )
950
            )
951
        );
952
    }
953
954
    public function testUserMetadataFilterOwnerInAMember()
955
    {
956
        $this->assertSearchResults(
957
            array(225),
958
            $this->getContentSearchHandler()->findLocations(
959
                new LocationQuery(
960
                    array(
961
                        'filter' => new Criterion\UserMetadata(
962
                            Criterion\UserMetadata::OWNER,
963
                            Criterion\Operator::IN,
964
                            array(226)
965
                        ),
966
                    )
967
                )
968
            )
969
        );
970
    }
971
972
    public function testUserMetadataFilterCreatorEqAMember()
973
    {
974
        $this->assertSearchResults(
975
            array(225),
976
            $this->getContentSearchHandler()->findLocations(
977
                new LocationQuery(
978
                    array(
979
                        'filter' => new Criterion\UserMetadata(
980
                            Criterion\UserMetadata::MODIFIER,
981
                            Criterion\Operator::EQ,
982
                            226
983
                        ),
984
                    )
985
                )
986
            )
987
        );
988
    }
989
990
    public function testUserMetadataFilterCreatorInAMember()
991
    {
992
        $this->assertSearchResults(
993
            array(225),
994
            $this->getContentSearchHandler()->findLocations(
995
                new LocationQuery(
996
                    array(
997
                        'filter' => new Criterion\UserMetadata(
998
                            Criterion\UserMetadata::MODIFIER,
999
                            Criterion\Operator::IN,
1000
                            array(226)
1001
                        ),
1002
                    )
1003
                )
1004
            )
1005
        );
1006
    }
1007
1008
    public function testUserMetadataFilterEqGroupMember()
1009
    {
1010
        $this->assertSearchResults(
1011
            array(225),
1012
            $this->getContentSearchHandler()->findLocations(
1013
                new LocationQuery(
1014
                    array(
1015
                        'filter' => new Criterion\UserMetadata(
1016
                            Criterion\UserMetadata::GROUP,
1017
                            Criterion\Operator::EQ,
1018
                            11
1019
                        ),
1020
                    )
1021
                )
1022
            )
1023
        );
1024
    }
1025
1026
    public function testUserMetadataFilterInGroupMember()
1027
    {
1028
        $this->assertSearchResults(
1029
            array(225),
1030
            $this->getContentSearchHandler()->findLocations(
1031
                new LocationQuery(
1032
                    array(
1033
                        'filter' => new Criterion\UserMetadata(
1034
                            Criterion\UserMetadata::GROUP,
1035
                            Criterion\Operator::IN,
1036
                            array(11)
1037
                        ),
1038
                    )
1039
                )
1040
            )
1041
        );
1042
    }
1043
1044
    public function testUserMetadataFilterEqGroupMemberNoMatch()
1045
    {
1046
        $this->assertSearchResults(
1047
            array(),
1048
            $this->getContentSearchHandler()->findLocations(
1049
                new LocationQuery(
1050
                    array(
1051
                        'filter' => new Criterion\UserMetadata(
1052
                            Criterion\UserMetadata::GROUP,
1053
                            Criterion\Operator::EQ,
1054
                            13
1055
                        ),
1056
                    )
1057
                )
1058
            )
1059
        );
1060
    }
1061
1062
    public function testUserMetadataFilterInGroupMemberNoMatch()
1063
    {
1064
        $this->assertSearchResults(
1065
            array(),
1066
            $this->getContentSearchHandler()->findLocations(
1067
                new LocationQuery(
1068
                    array(
1069
                        'filter' => new Criterion\UserMetadata(
1070
                            Criterion\UserMetadata::GROUP,
1071
                            Criterion\Operator::IN,
1072
                            array(13)
1073
                        ),
1074
                    )
1075
                )
1076
            )
1077
        );
1078
    }
1079
1080 View Code Duplication
    public function testLanguageCodeFilter()
1081
    {
1082
        $this->assertSearchResults(
1083
            array(2, 5, 12, 13, 14, 15, 43, 44, 45, 48),
1084
            $this->getContentSearchHandler()->findLocations(
1085
                new LocationQuery(
1086
                    array(
1087
                        'filter' => new Criterion\LanguageCode('eng-US'),
1088
                        'limit' => 10,
1089
                        'sortClauses' => array(new SortClause\Location\Id()),
1090
                    )
1091
                )
1092
            )
1093
        );
1094
    }
1095
1096
    public function testLanguageCodeFilterIn()
1097
    {
1098
        $this->assertSearchResults(
1099
            array(2, 5, 12, 13, 14, 15, 43, 44, 45, 48),
1100
            $this->getContentSearchHandler()->findLocations(
1101
                new LocationQuery(
1102
                    array(
1103
                        'filter' => new Criterion\LanguageCode(array('eng-US', 'eng-GB')),
1104
                        'limit' => 10,
1105
                        'sortClauses' => array(new SortClause\Location\Id()),
1106
                    )
1107
                )
1108
            )
1109
        );
1110
    }
1111
1112 View Code Duplication
    public function testLanguageCodeFilterWithAlwaysAvailable()
1113
    {
1114
        $this->assertSearchResults(
1115
            array(2, 5, 12, 13, 14, 15, 43, 44, 45, 48, 51, 52, 53, 58, 59, 70, 72, 76, 78, 82),
1116
            $this->getContentSearchHandler()->findLocations(
1117
                new LocationQuery(
1118
                    array(
1119
                        'filter' => new Criterion\LanguageCode('eng-GB', true),
1120
                        'limit' => 20,
1121
                        'sortClauses' => array(new SortClause\ContentId()),
1122
                    )
1123
                )
1124
            )
1125
        );
1126
    }
1127
1128
    public function testMatchAllFilter()
1129
    {
1130
        $result = $this->getContentSearchHandler()->findLocations(
1131
            new LocationQuery(
1132
                array(
1133
                    'filter' => new Criterion\MatchAll(),
1134
                    'limit' => 10,
1135
                    'sortClauses' => array(new SortClause\Location\Id()),
1136
                )
1137
            )
1138
        );
1139
1140
        $this->assertCount(10, $result->searchHits);
1141
        $this->assertEquals(186, $result->totalCount);
1142
        $this->assertSearchResults(
1143
            array(2, 5, 12, 13, 14, 15, 43, 44, 45, 48),
1144
            $result
1145
        );
1146
    }
1147
1148
    public function testFullTextFilter()
1149
    {
1150
        $this->assertSearchResults(
1151
            array(193),
1152
            $this->getContentSearchHandler()->findLocations(
1153
                new LocationQuery(
1154
                    array(
1155
                        'filter' => new Criterion\FullText('applied webpage'),
1156
                        'limit' => 10,
1157
                    )
1158
                )
1159
            )
1160
        );
1161
    }
1162
1163
    public function testFullTextWildcardFilter()
1164
    {
1165
        $this->assertSearchResults(
1166
            array(193),
1167
            $this->getContentSearchHandler()->findLocations(
1168
                new LocationQuery(
1169
                    array(
1170
                        'filter' => new Criterion\FullText('applie*'),
1171
                        'limit' => 10,
1172
                    )
1173
                )
1174
            )
1175
        );
1176
    }
1177
1178
    public function testFullTextDisabledWildcardFilter()
1179
    {
1180
        $this->assertSearchResults(
1181
            array(),
1182
            $this->getContentSearchHandler(array('enableWildcards' => false))->findLocations(
1183
                new LocationQuery(
1184
                    array(
1185
                        'filter' => new Criterion\FullText('applie*'),
1186
                        'limit' => 10,
1187
                    )
1188
                )
1189
            )
1190
        );
1191
    }
1192
1193
    public function testFullTextFilterStopwordRemoval()
1194
    {
1195
        $handler = $this->getContentSearchHandler(
1196
            array(
1197
                'stopWordThresholdFactor' => 0.1,
1198
            )
1199
        );
1200
        $this->assertSearchResults(
1201
            array(),
1202
            $handler->findLocations(
1203
                new LocationQuery(
1204
                    array(
1205
                        'filter' => new Criterion\FullText('the'),
1206
                        'limit' => 10,
1207
                    )
1208
                )
1209
            )
1210
        );
1211
    }
1212
1213
    public function testFullTextFilterNoStopwordRemoval()
1214
    {
1215
        $handler = $this->getContentSearchHandler(
1216
            array(
1217
                'stopWordThresholdFactor' => 1,
1218
            )
1219
        );
1220
1221
        $result = $handler->findLocations(
1222
            new LocationQuery(
1223
                array(
1224
                    'filter' => new Criterion\FullText(
1225
                        'the'
1226
                    ),
1227
                    'limit' => 10,
1228
                )
1229
            )
1230
        );
1231
1232
        $this->assertEquals(26, $result->totalCount);
1233
        $this->assertCount(10, $result->searchHits);
1234
        $this->assertEquals(
1235
            10,
1236
            count(
1237
                array_map(
1238
                    function ($hit) {
1239
                        return $hit->valueObject->id;
1240
                    },
1241
                    $result->searchHits
1242
                )
1243
            )
1244
        );
1245
    }
1246
1247
    /**
1248
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1249
     */
1250
    public function testFullTextFilterInvalidStopwordThreshold()
1251
    {
1252
        $this->getContentSearchHandler(
1253
            array(
1254
                'stopWordThresholdFactor' => 2,
1255
            )
1256
        );
1257
    }
1258
1259
    public function testFieldRelationFilterContainsSingle()
1260
    {
1261
        $this->assertSearchResults(
1262
            array(69),
1263
            $this->getContentSearchHandler()->findLocations(
1264
                new LocationQuery(
1265
                    array(
1266
                        'filter' => new Criterion\FieldRelation(
1267
                            'billboard',
1268
                            Criterion\Operator::CONTAINS,
1269
                            array(60)
1270
                        ),
1271
                    )
1272
                )
1273
            )
1274
        );
1275
    }
1276
1277
    public function testFieldRelationFilterContainsSingleNoMatch()
1278
    {
1279
        $this->assertSearchResults(
1280
            array(),
1281
            $this->getContentSearchHandler()->findLocations(
1282
                new LocationQuery(
1283
                    array(
1284
                        'filter' => new Criterion\FieldRelation(
1285
                            'billboard',
1286
                            Criterion\Operator::CONTAINS,
1287
                            array(4)
1288
                        ),
1289
                    )
1290
                )
1291
            )
1292
        );
1293
    }
1294
1295 View Code Duplication
    public function testFieldRelationFilterContainsArray()
1296
    {
1297
        $this->assertSearchResults(
1298
            array(69),
1299
            $this->getContentSearchHandler()->findLocations(
1300
                new LocationQuery(
1301
                    array(
1302
                        'filter' => new Criterion\FieldRelation(
1303
                            'billboard',
1304
                            Criterion\Operator::CONTAINS,
1305
                            array(60, 75)
1306
                        ),
1307
                    )
1308
                )
1309
            )
1310
        );
1311
    }
1312
1313
    public function testFieldRelationFilterContainsArrayNotMatch()
1314
    {
1315
        $this->assertSearchResults(
1316
            array(),
1317
            $this->getContentSearchHandler()->findLocations(
1318
                new LocationQuery(
1319
                    array(
1320
                        'filter' => new Criterion\FieldRelation(
1321
                            'billboard',
1322
                            Criterion\Operator::CONTAINS,
1323
                            array(60, 64)
1324
                        ),
1325
                    )
1326
                )
1327
            )
1328
        );
1329
    }
1330
1331 View Code Duplication
    public function testFieldRelationFilterInArray()
1332
    {
1333
        $this->assertSearchResults(
1334
            array(69, 77),
1335
            $this->getContentSearchHandler()->findLocations(
1336
                new LocationQuery(
1337
                    array(
1338
                        'filter' => new Criterion\FieldRelation(
1339
                            'billboard',
1340
                            Criterion\Operator::IN,
1341
                            array(60, 64)
1342
                        ),
1343
                    )
1344
                )
1345
            )
1346
        );
1347
    }
1348
1349
    public function testFieldRelationFilterInArrayNotMatch()
1350
    {
1351
        $this->assertSearchResults(
1352
            array(),
1353
            $this->getContentSearchHandler()->findLocations(
1354
                new LocationQuery(
1355
                    array(
1356
                        'filter' => new Criterion\FieldRelation(
1357
                            'billboard',
1358
                            Criterion\Operator::IN,
1359
                            array(4, 10)
1360
                        ),
1361
                    )
1362
                )
1363
            )
1364
        );
1365
    }
1366
1367
    public function testFieldFilter()
1368
    {
1369
        $this->assertSearchResults(
1370
            array(12),
1371
            $this->getContentSearchHandler()->findLocations(
1372
                new LocationQuery(
1373
                    array(
1374
                        'filter' => new Criterion\Field(
1375
                            'name',
1376
                            Criterion\Operator::EQ,
1377
                            'members'
1378
                        ),
1379
                        'limit' => 10,
1380
                    )
1381
                )
1382
            )
1383
        );
1384
    }
1385
1386
    public function testFieldFilterIn()
1387
    {
1388
        $this->assertSearchResults(
1389
            array(12, 44),
1390
            $this->getContentSearchHandler()->findLocations(
1391
                new LocationQuery(
1392
                    array(
1393
                        'filter' => new Criterion\Field(
1394
                            'name',
1395
                            Criterion\Operator::IN,
1396
                            array('members', 'anonymous users')
1397
                        ),
1398
                        'limit' => 10,
1399
                    )
1400
                )
1401
            )
1402
        );
1403
    }
1404
1405
    public function testFieldFilterContainsPartial()
1406
    {
1407
        $this->assertSearchResults(
1408
            array(44),
1409
            $this->getContentSearchHandler()->findLocations(
1410
                new LocationQuery(
1411
                    array(
1412
                        'filter' => new Criterion\Field(
1413
                            'name',
1414
                            Criterion\Operator::CONTAINS,
1415
                            'nonymous use'
1416
                        ),
1417
                        'limit' => 10,
1418
                    )
1419
                )
1420
            )
1421
        );
1422
    }
1423
1424
    public function testFieldFilterContainsSimple()
1425
    {
1426
        $this->assertSearchResults(
1427
            array(79),
1428
            $this->getContentSearchHandler()->findLocations(
1429
                new LocationQuery(
1430
                    array(
1431
                        'filter' => new Criterion\Field(
1432
                            'publish_date',
1433
                            Criterion\Operator::CONTAINS,
1434
                            1174643880
1435
                        ),
1436
                        'limit' => 10,
1437
                    )
1438
                )
1439
            )
1440
        );
1441
    }
1442
1443
    public function testFieldFilterContainsSimpleNoMatch()
1444
    {
1445
        $this->assertSearchResults(
1446
            array(),
1447
            $this->getContentSearchHandler()->findLocations(
1448
                new LocationQuery(
1449
                    array(
1450
                        'filter' => new Criterion\Field(
1451
                            'publish_date',
1452
                            Criterion\Operator::CONTAINS,
1453
                            1174643
1454
                        ),
1455
                        'limit' => 10,
1456
                    )
1457
                )
1458
            )
1459
        );
1460
    }
1461
1462
    public function testFieldFilterBetween()
1463
    {
1464
        $this->assertSearchResults(
1465
            array(71, 73, 74),
1466
            $this->getContentSearchHandler()->findLocations(
1467
                new LocationQuery(
1468
                    array(
1469
                        'filter' => new Criterion\Field(
1470
                            'price',
1471
                            Criterion\Operator::BETWEEN,
1472
                            array(10000, 1000000)
1473
                        ),
1474
                        'limit' => 10,
1475
                    )
1476
                )
1477
            )
1478
        );
1479
    }
1480
1481 View Code Duplication
    public function testFieldFilterOr()
1482
    {
1483
        $this->assertSearchResults(
1484
            array(12, 71, 73, 74),
1485
            $this->getContentSearchHandler()->findLocations(
1486
                new LocationQuery(
1487
                    array(
1488
                        'filter' => new Criterion\LogicalOr(
1489
                            array(
1490
                                new Criterion\Field(
1491
                                    'name',
1492
                                    Criterion\Operator::EQ,
1493
                                    'members'
1494
                                ),
1495
                                new Criterion\Field(
1496
                                    'price',
1497
                                    Criterion\Operator::BETWEEN,
1498
                                    array(10000, 1000000)
1499
                                ),
1500
                            )
1501
                        ),
1502
                        'limit' => 10,
1503
                    )
1504
                )
1505
            )
1506
        );
1507
    }
1508
1509 View Code Duplication
    public function testIsMainLocationFilter()
1510
    {
1511
        $this->assertSearchResults(
1512
            array(225),
1513
            $this->getContentSearchHandler()->findLocations(
1514
                new LocationQuery(
1515
                    array(
1516
                        'filter' => new Criterion\LogicalAnd(
1517
                            array(
1518
                                new Criterion\ParentLocationId(224),
1519
                                new Criterion\Location\IsMainLocation(
1520
                                    Criterion\Location\IsMainLocation::MAIN
1521
                                ),
1522
                            )
1523
                        ),
1524
                        'limit' => 10,
1525
                    )
1526
                )
1527
            )
1528
        );
1529
    }
1530
1531 View Code Duplication
    public function testIsNotMainLocationFilter()
1532
    {
1533
        $this->assertSearchResults(
1534
            array(510),
1535
            $this->getContentSearchHandler()->findLocations(
1536
                new LocationQuery(
1537
                    array(
1538
                        'filter' => new Criterion\LogicalAnd(
1539
                            array(
1540
                                new Criterion\ParentLocationId(224),
1541
                                new Criterion\Location\IsMainLocation(
1542
                                    Criterion\Location\IsMainLocation::NOT_MAIN
1543
                                ),
1544
                            )
1545
                        ),
1546
                        'limit' => 10,
1547
                    )
1548
                )
1549
            )
1550
        );
1551
    }
1552
}
1553