Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
ParsedBooleanNode
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
4 / 4
4
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 toArray
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
1
 getClauses
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 accept
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace CirrusSearch\Parser\AST;
4
5use CirrusSearch\Parser\AST\Visitor\Visitor;
6
7/**
8 * A boolean expression.
9 *
10 * This "boolean expression" is suited for matching document in search. It's not really
11 * describing a binary tree as one would use to a compute a boolean algebra.
12 * It is a flat list of clauses where the clauses are not connected to each others but
13 * rather describe how individual clause must occur in a given document:
14 * - MUST
15 * - MUST_NOT
16 * - SHOULD
17 *
18 * There is a direct relationship between boolean algebra and this representation:
19 * - A AND B: [ MUST:A, MUST:B ]
20 * - A OR B: [ SHOULD:A, SHOULD:B ]
21 * - A AND NOT B: [ MUST:A, MUST_NOT: B ]
22 *
23 * But it supports describing something that is impossible to describe in a boolean algebra:
24 * - [ MUST:A, SHOULD:B ]: here the boolean algebra is not suited since SHOULD:B is pointless
25 *   but for search it can be considered as a "scoring hint", i.e. give me all docs matching A but
26 *   it's "better" to have docs matching B as well. When filtering the search backend can silently
27 *   ignore the SHOULD:B but when scoring it will be taken into account.
28 *
29 * In the end this representation makes it possible to support a syntax like:
30 * word1 +word2 -word3: [ SHOULD:word1, MUST:word2, MUST_NOT:word3 ]
31 * which would not be possible with a binary expression tree
32 */
33class ParsedBooleanNode extends ParsedNode {
34    /**
35     * @var BooleanClause[]
36     */
37    private $clauses;
38
39    /**
40     * @param int $startOffset
41     * @param int $endOffset
42     * @param BooleanClause[] $children
43     */
44    public function __construct( $startOffset, $endOffset, array $children ) {
45        parent::__construct( $startOffset, $endOffset );
46        $this->clauses = $children;
47    }
48
49    /**
50     * @return array
51     */
52    public function toArray() {
53        return [ "bool" => array_merge(
54            parent::baseParams(),
55            [
56                'clauses' => array_map(
57                    static function ( BooleanClause $clause ) {
58                        return [
59                            $clause->getOccur() => $clause->getNode()->toArray(),
60                            "explicit" => $clause->isExplicit(),
61                        ];
62                    },
63                    $this->clauses
64                )
65            ]
66        ) ];
67    }
68
69    /**
70     * @return BooleanClause[]
71     */
72    public function getClauses() {
73        return $this->clauses;
74    }
75
76    /**
77     * @param Visitor $visitor
78     */
79    public function accept( Visitor $visitor ) {
80        $visitor->visitParsedBooleanNode( $this );
81    }
82}