From 109545fc95fc8edf03e7686c1d19743ec6f4a517 Mon Sep 17 00:00:00 2001
From: mscherer <mark.scherer@spryker.com>
Date: Mon, 8 Oct 2018 13:34:06 +0200
Subject: [PATCH 1/5] Add multi value separator

---
 README.md                 |  8 ++++++++
 src/Model/Filter/Base.php | 37 ++++++++++++++++++++++++++++++-------
 src/Model/Filter/Like.php |  1 +
 3 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/README.md b/README.md
index 7f31d3e3..6a53c540 100644
--- a/README.md
+++ b/README.md
@@ -337,6 +337,10 @@ The following options are supported by all filters except `Callback` and `Finder
   multiple values. If disabled, and multiple values are being passed, the filter
   will fall back to using the default value defined by the `defaultValue` option.
 
+- `multiValueSeparator` (`string`, defaults to `null`) Defines whether the filter should
+  auto-tokenize multiple values using a specific separator string. If disabled, the data
+  must be an in form of an array.
+
 - `field` (`string|array`), defaults to the name passed to the first argument of the
   add filter method) The name of the field to use for searching. Works like the base
   `field` option but also accepts multiple field names as an array. When defining
@@ -389,6 +393,10 @@ The following options are supported by all filters except `Callback` and `Finder
 - `multiValue` (`bool`, defaults to `false`) Defines whether the filter accepts
   multiple values. If disabled, and multiple values are being passed, the filter
   will fall back to using the default value defined by the `defaultValue` option.
+  
+- `multiValueSeparator` (`string`, defaults to `null`) Defines whether the filter should
+  auto-tokenize multiple values using a specific separator string. If disabled, the data
+  must be an in form of an array.  
 
 - `mode` (`string`, defaults to `OR`) The conditional mode to use when matching
   against multiple fields. Valid values are `OR` and `AND`.
diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php
index 50893d59..ee70ab7f 100644
--- a/src/Model/Filter/Base.php
+++ b/src/Model/Filter/Base.php
@@ -51,6 +51,7 @@ abstract class Base
      * @param string $name Name.
      * @param \Search\Manager $manager Manager.
      * @param array $config Config.
+     * @throws \InvalidArgumentException
      */
     public function __construct($name, Manager $manager, array $config = [])
     {
@@ -65,6 +66,7 @@ public function __construct($name, Manager $manager, array $config = [])
             'filterEmpty' => false,
             'defaultValue' => null,
             'multiValue' => false,
+            'multiValueSeparator' => null,
             'flatten' => true,
         ];
         $config += $defaults;
@@ -188,13 +190,34 @@ public function skip()
     public function value()
     {
         $value = $this->_config['defaultValue'];
-        if (isset($this->_args[$this->name()])) {
-            $passedValue = $this->_args[$this->name()];
-            if (!is_array($passedValue) ||
-                $this->getConfig('multiValue')
-            ) {
-                return $passedValue;
-            }
+
+        $passedValue = $this->passedValue();
+        if ($passedValue === null) {
+            return $value;
+        }
+
+        if (!is_array($passedValue) ||
+            $this->getConfig('multiValue')
+        ) {
+            return $passedValue;
+        }
+
+        return $value;
+    }
+
+    /**
+     * @return string|array|null
+     */
+    public function passedValue()
+    {
+        if (!isset($this->_args[$this->name()])) {
+            return null;
+        }
+
+        $value = $this->_args[$this->name()];
+
+        if ($this->getConfig('multiValueSeparator')) {
+            return explode($this->getConfig('multiValueSeparator'), $value);
         }
 
         return $value;
diff --git a/src/Model/Filter/Like.php b/src/Model/Filter/Like.php
index 24bfc197..dd7b74ca 100644
--- a/src/Model/Filter/Like.php
+++ b/src/Model/Filter/Like.php
@@ -143,6 +143,7 @@ protected function _formatWildcards($value)
      * set configuration for escape driver name
      *
      * @return void
+     * @throws \InvalidArgumentException
      */
     protected function _setEscaper()
     {

From a3014123ce1c93f591d9178b48273bfcb988a0eb Mon Sep 17 00:00:00 2001
From: Mark Sch <dereuromark@users.noreply.github.com>
Date: Mon, 8 Oct 2018 15:20:57 +0200
Subject: [PATCH 2/5] Wrap as protected method to keep exploding internally.

---
 src/Model/Filter/Base.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php
index ee70ab7f..f53b2aba 100644
--- a/src/Model/Filter/Base.php
+++ b/src/Model/Filter/Base.php
@@ -208,7 +208,7 @@ public function value()
     /**
      * @return string|array|null
      */
-    public function passedValue()
+    protected function passedValue()
     {
         if (!isset($this->_args[$this->name()])) {
             return null;

From 3894fcd65c1f770c06200d69e778e09727e32ba4 Mon Sep 17 00:00:00 2001
From: mscherer <mark.scherer@spryker.com>
Date: Mon, 8 Oct 2018 15:26:15 +0200
Subject: [PATCH 3/5] Encapsulate passed value logic

---
 src/Model/Filter/Base.php | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php
index f53b2aba..b3c0ac39 100644
--- a/src/Model/Filter/Base.php
+++ b/src/Model/Filter/Base.php
@@ -196,12 +196,6 @@ public function value()
             return $value;
         }
 
-        if (!is_array($passedValue) ||
-            $this->getConfig('multiValue')
-        ) {
-            return $passedValue;
-        }
-
         return $value;
     }
 
@@ -216,6 +210,10 @@ protected function passedValue()
 
         $value = $this->_args[$this->name()];
 
+        if (is_array($value)) {
+            return $this->getConfig('multiValue') ? $value : null;
+        }
+
         if ($this->getConfig('multiValueSeparator')) {
             return explode($this->getConfig('multiValueSeparator'), $value);
         }

From 07d634f1b0eeb3272276e6634df854c67d42bf8b Mon Sep 17 00:00:00 2001
From: mscherer <mark.scherer@spryker.com>
Date: Mon, 8 Oct 2018 15:31:38 +0200
Subject: [PATCH 4/5] Add tests

---
 src/Model/Filter/Base.php                |  4 +--
 tests/TestCase/Model/Filter/BaseTest.php | 33 ++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php
index b3c0ac39..2e77954f 100644
--- a/src/Model/Filter/Base.php
+++ b/src/Model/Filter/Base.php
@@ -196,7 +196,7 @@ public function value()
             return $value;
         }
 
-        return $value;
+        return $passedValue;
     }
 
     /**
@@ -214,7 +214,7 @@ protected function passedValue()
             return $this->getConfig('multiValue') ? $value : null;
         }
 
-        if ($this->getConfig('multiValueSeparator')) {
+        if ($this->getConfig('multiValue') && $this->getConfig('multiValueSeparator')) {
             return explode($this->getConfig('multiValueSeparator'), $value);
         }
 
diff --git a/tests/TestCase/Model/Filter/BaseTest.php b/tests/TestCase/Model/Filter/BaseTest.php
index 013abfe5..663d1b5e 100644
--- a/tests/TestCase/Model/Filter/BaseTest.php
+++ b/tests/TestCase/Model/Filter/BaseTest.php
@@ -172,12 +172,45 @@ public function testValue()
 
         $filter->setArgs(['field' => ['value1', 'value2']]);
         $this->assertEquals('default', $filter->value());
+    }
+
+    /**
+     * @return void
+     */
+    public function testValueMultiValue()
+    {
+        $filter = new TestFilter(
+            'field',
+            $this->Manager,
+            ['defaultValue' => 'default']
+        );
 
         $filter->setConfig('multiValue', true);
         $filter->setArgs(['field' => ['value1', 'value2']]);
         $this->assertEquals(['value1', 'value2'], $filter->value());
     }
 
+    /**
+     * @return void
+     */
+    public function testValueMultiValueSeparator()
+    {
+        $filter = new TestFilter(
+            'field',
+            $this->Manager,
+            ['defaultValue' => 'default']
+        );
+
+        $filter->setConfig('multiValue', true);
+        $filter->setConfig('multiValueSeparator', '|');
+
+        $filter->setArgs(['field' => 'value1|value2']);
+        $this->assertEquals(['value1', 'value2'], $filter->value());
+
+        $filter->setArgs(['field' => ['value1', 'value2']]);
+        $this->assertEquals(['value1', 'value2'], $filter->value());
+    }
+
     /**
      * @return void
      */

From 10fa0d5711d98f211105d7df587087ea34508e1c Mon Sep 17 00:00:00 2001
From: mscherer <mark.scherer@spryker.com>
Date: Mon, 8 Oct 2018 15:41:10 +0200
Subject: [PATCH 5/5] Add more tests

---
 src/Model/Filter/Base.php                |  2 +-
 tests/TestCase/Model/Filter/BaseTest.php | 19 ++++++++++++++++---
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php
index 2e77954f..c7c44b58 100644
--- a/src/Model/Filter/Base.php
+++ b/src/Model/Filter/Base.php
@@ -214,7 +214,7 @@ protected function passedValue()
             return $this->getConfig('multiValue') ? $value : null;
         }
 
-        if ($this->getConfig('multiValue') && $this->getConfig('multiValueSeparator')) {
+        if ($this->getConfig('multiValueSeparator')) {
             return explode($this->getConfig('multiValueSeparator'), $value);
         }
 
diff --git a/tests/TestCase/Model/Filter/BaseTest.php b/tests/TestCase/Model/Filter/BaseTest.php
index 663d1b5e..f2174dd4 100644
--- a/tests/TestCase/Model/Filter/BaseTest.php
+++ b/tests/TestCase/Model/Filter/BaseTest.php
@@ -201,14 +201,27 @@ public function testValueMultiValueSeparator()
             ['defaultValue' => 'default']
         );
 
-        $filter->setConfig('multiValue', true);
         $filter->setConfig('multiValueSeparator', '|');
 
         $filter->setArgs(['field' => 'value1|value2']);
         $this->assertEquals(['value1', 'value2'], $filter->value());
+    }
 
-        $filter->setArgs(['field' => ['value1', 'value2']]);
-        $this->assertEquals(['value1', 'value2'], $filter->value());
+    /**
+     * @return void
+     */
+    public function testValueMultiValueSeparatorInvalid()
+    {
+        $filter = new TestFilter(
+            'field',
+            $this->Manager,
+            ['defaultValue' => 'default']
+        );
+
+        $filter->setConfig('multiValue', true);
+
+        $filter->setArgs(['field' => 'value1|value2']);
+        $this->assertEquals('value1|value2', $filter->value());
     }
 
     /**