diff --git a/src/QueryExpressionFilter.php b/src/QueryExpressionFilter.php index b848b4d..df63256 100644 --- a/src/QueryExpressionFilter.php +++ b/src/QueryExpressionFilter.php @@ -118,6 +118,8 @@ private function matchValue($data, $column, $expectation) return ($actualValue === $expectedValue); } elseif ($comparator === '$in') { return in_array($actualValue, $expectedValue, true); + } elseif ($comparator === '$contains') { + return (strpos($actualValue, $expectedValue) !== false); } elseif ($comparator === '$lt') { return ($actualValue < $expectedValue); } elseif ($comparator === '$lte') { diff --git a/tests/QueryExpressionFilterTest.php b/tests/QueryExpressionFilterTest.php index 46ba0d9..33488ef 100644 --- a/tests/QueryExpressionFilterTest.php +++ b/tests/QueryExpressionFilterTest.php @@ -363,4 +363,23 @@ public function testInvalidOr() $filter->doesMatch(array('id' => 100)); } + + public function testAttributeContains() + { + $filter = new QueryExpressionFilter(array( + 'name' => array( + '$contains' => 'Fried' + ) + )); + + $this->assertFalse($filter->doesMatch(array( + 'id' => 100, + 'name' => 'Smith, George' + ))); + $this->assertTrue($filter->doesMatch(array( + 'id' => 300, + 'name' => 'Smith, Friedrich' + ))); + } + }