From 5f6285cb08e1a3d1f3d62bad486f9787f142e057 Mon Sep 17 00:00:00 2001 From: alphard29 Date: Mon, 11 Sep 2023 14:11:20 +0700 Subject: [PATCH 1/4] update limit --- src/Parser.php | 11 +++++++++-- tests/ParserTest.php | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/Parser.php b/src/Parser.php index 8d4487c..951fa0a 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -52,9 +52,16 @@ public function __construct($raw) $this->source = new Source($_from[1]); if (preg_match("/define\s*(.*)/is", $raw, $_definer)) { - if (preg_match("/filter\s*(.*)\s*limit/i", $_definer[1], $_filter)) { + if (preg_match("/filter\s*(.*)\s*limit/is", $_definer[1], $_filter)) { // get limit - if (preg_match("/limit\s(\d)/is", $_filter[1], $_limit)) { + preg_match("/(.*?)\s*filter/is", $_definer[1], $_extractDefinerFromFilter); + // extract definer + $this->makeDefiners($_extractDefinerFromFilter[1]); + + // extract filter + $this->makeFilters($_filter[1]); + + if (preg_match("/limit\s*(\d+)\s*/is", $_definer[1], $_limit)) { $this->limit = intval($_limit[1]); } } elseif (preg_match("/filter\s*(.*)/is", $_definer[1], $_filter)) { diff --git a/tests/ParserTest.php b/tests/ParserTest.php index e55f50d..932e1ec 100644 --- a/tests/ParserTest.php +++ b/tests/ParserTest.php @@ -240,4 +240,29 @@ public function testParseQueryWithReplaceAndAttrAndAppendNodeDefinerReverse2ButW $this->assertSame('attr(href, div > h1 > span > a)', $parser->getDefiners()[1]); $this->assertSame("replace('i am', 'you are', div > h1 > span > a)", $parser->getDefiners()[2]); } + + public function testParseWithLimit() + { + $query = " + from ( .item ) + define + append_node(.list > .item, li) as list, + attr(href, div > h1 > span > a), + replace('i am', 'you are', div > h1 > span > a) + filter + span > a.title has 'lorem' and + attr(id, span > a) > 9 + limit 1 + "; + + $parser = new Parser($query); + + $this->assertSame('.item', $parser->getSource()->getRaw()); + $this->assertCount(3, $parser->getDefiners(), 'should have 2 definers'); + $this->assertCount(2, $parser->getFilters()['and'], 'should have 2 filters'); + $this->assertSame(1, $parser->limit); + $this->assertSame('append_node(.list > .item, li) as list', $parser->getDefiners()[0]); + $this->assertSame('attr(href, div > h1 > span > a)', $parser->getDefiners()[1]); + $this->assertSame("replace('i am', 'you are', div > h1 > span > a)", $parser->getDefiners()[2]); + } } From 73509efb1d4a01f79d89980d67bbd170f09e47c2 Mon Sep 17 00:00:00 2001 From: Cacing69 <36250619+cacing69@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:20:02 +0700 Subject: [PATCH 2/4] Update Parser.php --- src/Parser.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Parser.php b/src/Parser.php index 951fa0a..1edee04 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -16,7 +16,7 @@ class Parser use HasRawProperty; use HasDefinersProperty; use HasFiltersProperty; - public $limit; + protected $limit; public $onDocumentLoaded; // 1). \s*from\s*\(\s*(.*?)\s*\)\s*define\s*(.*?)\s*filter\s*(.*)\s*limit\s*(.*)\s* @@ -184,4 +184,8 @@ public function getDefiners() { return $this->definers; } + + public getLimit() { + return $this->limit; + } } From 72848f49ed1d36de85817eb4870d896f48606b39 Mon Sep 17 00:00:00 2001 From: Cacing69 <36250619+cacing69@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:20:41 +0700 Subject: [PATCH 3/4] Update ParserTest.php --- tests/ParserTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ParserTest.php b/tests/ParserTest.php index 932e1ec..8743a9a 100644 --- a/tests/ParserTest.php +++ b/tests/ParserTest.php @@ -260,7 +260,7 @@ public function testParseWithLimit() $this->assertSame('.item', $parser->getSource()->getRaw()); $this->assertCount(3, $parser->getDefiners(), 'should have 2 definers'); $this->assertCount(2, $parser->getFilters()['and'], 'should have 2 filters'); - $this->assertSame(1, $parser->limit); + $this->assertSame(1, $parser->getLimit()); $this->assertSame('append_node(.list > .item, li) as list', $parser->getDefiners()[0]); $this->assertSame('attr(href, div > h1 > span > a)', $parser->getDefiners()[1]); $this->assertSame("replace('i am', 'you are', div > h1 > span > a)", $parser->getDefiners()[2]); From 99864df14ff16246a5119805ba84547a16f9174b Mon Sep 17 00:00:00 2001 From: Cacing69 <36250619+cacing69@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:21:42 +0700 Subject: [PATCH 4/4] Update Parser.php --- src/Parser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Parser.php b/src/Parser.php index 1edee04..7ebcce0 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -185,7 +185,7 @@ public function getDefiners() return $this->definers; } - public getLimit() { + public function getLimit() { return $this->limit; } }