Add new types Array, Boolean, Record, Math

Signed-off-by: davidarendsen <davidarendsen@hey.com>
This commit is contained in:
davidarendsen 2022-08-16 14:46:06 +00:00
commit 057a2d625e
10 changed files with 137 additions and 29 deletions

View file

@ -2,6 +2,7 @@
namespace Arendsen\FluxQueryBuilder; namespace Arendsen\FluxQueryBuilder;
use Arendsen\FluxQueryBuilder\Type\ArrayType;
use DateTime; use DateTime;
use Arendsen\FluxQueryBuilder\Type\Time; use Arendsen\FluxQueryBuilder\Type\Time;
@ -9,12 +10,10 @@ class Formatters
{ {
public static function valueToString($value): string public static function valueToString($value): string
{ {
if (is_string($value)) { if (is_array($value)) {
return '"' . $value . '"'; return '[' . new ArrayType($value) . ']';
} elseif (is_bool($value)) { } else {
return $value ? 'true' : 'false'; return new Type($value);
} elseif (is_array($value)) {
return '[' . self::toFluxArrayString($value) . ']';
} }
return $value; return $value;
@ -22,15 +21,7 @@ class Formatters
public static function toFluxArrayString(array $array): string public static function toFluxArrayString(array $array): string
{ {
array_walk($array, function (&$value, $key) { return new ArrayType($array);
if (is_string($key)) {
$value = $key . ': ' . self::valueToString($value);
} else {
$value = self::valueToString($value);
}
});
return implode(', ', $array);
} }
public static function dateTimeToString(DateTime $dateTime): string public static function dateTimeToString(DateTime $dateTime): string

View file

@ -3,6 +3,7 @@
namespace Arendsen\FluxQueryBuilder\Functions; namespace Arendsen\FluxQueryBuilder\Functions;
use Arendsen\FluxQueryBuilder\Formatters; use Arendsen\FluxQueryBuilder\Formatters;
use Arendsen\FluxQueryBuilder\Type\Record;
class Reduce extends Base class Reduce extends Base
{ {
@ -24,16 +25,8 @@ class Reduce extends Base
public function __toString() public function __toString()
{ {
return '|> reduce(fn: (r, accumulator) => ({' . implode(', ', $this->formatSettings($this->settings)) . '}), ' . return '|> reduce(fn: (r, accumulator) => (' . new Record($this->settings) . '), ' .
'identity: {' . Formatters::toFluxArrayString($this->identity) . '}) '; 'identity: ' . new Record($this->identity) . ') ';
} }
protected function formatSettings(array $settings)
{
array_walk($settings, function (&$value, $key) {
$value = $key . ': ' . $value;
});
return $settings;
}
} }

View file

@ -2,6 +2,8 @@
namespace Arendsen\FluxQueryBuilder; namespace Arendsen\FluxQueryBuilder;
use Arendsen\FluxQueryBuilder\Type\ArrayType;
use Arendsen\FluxQueryBuilder\Type\BooleanType;
use Arendsen\FluxQueryBuilder\Type\Time; use Arendsen\FluxQueryBuilder\Type\Time;
use DateTime; use DateTime;
@ -15,13 +17,17 @@ class Type
public function __toString(): string public function __toString(): string
{ {
switch (gettype($this->value)) { switch (gettype($this->value)) {
case 'string':
return '"' . $this->value . '"';
case 'object': case 'object':
if ($this->value instanceof DateTime) { if ($this->value instanceof DateTime) {
return new Time($this->value); return new Time($this->value);
} }
return $this->value->__toString(); return $this->value->__toString();
case 'string':
return '"' . $this->value . '"';
case 'boolean':
return new BooleanType($this->value);
case 'array':
return new ArrayType($this->value);
default: default:
return (string)$this->value; return (string)$this->value;
} }

27
src/Type/ArrayType.php Normal file
View file

@ -0,0 +1,27 @@
<?php
namespace Arendsen\FluxQueryBuilder\Type;
use Arendsen\FluxQueryBuilder\Formatters;
use Arendsen\FluxQueryBuilder\Type;
class ArrayType implements TypeInterface
{
public function __construct(array $value)
{
$this->value = $value;
}
public function __toString(): string
{
array_walk($this->value, function (&$value, $key) {
if (is_string($key)) {
$value = $key . ': ' . Formatters::valueToString($value);
} else {
$value = Formatters::valueToString($value);
}
});
return implode(', ', $this->value);
}
}

16
src/Type/BooleanType.php Normal file
View file

@ -0,0 +1,16 @@
<?php
namespace Arendsen\FluxQueryBuilder\Type;
class BooleanType implements TypeInterface
{
public function __construct($value)
{
$this->value = $value;
}
public function __toString(): string
{
return $this->value ? 'true' : 'false';
}
}

19
src/Type/Math.php Normal file
View file

@ -0,0 +1,19 @@
<?php
namespace Arendsen\FluxQueryBuilder\Type;
use Arendsen\FluxQueryBuilder\Formatters;
use Arendsen\FluxQueryBuilder\Type;
class Math implements TypeInterface
{
public function __construct(string $value)
{
$this->value = $value;
}
public function __toString(): string
{
return $this->value;
}
}

26
src/Type/Record.php Normal file
View file

@ -0,0 +1,26 @@
<?php
namespace Arendsen\FluxQueryBuilder\Type;
use Arendsen\FluxQueryBuilder\Type;
class Record implements TypeInterface
{
public function __construct(array $value)
{
$this->value = $value;
}
public function __toString(): string
{
array_walk($this->value, function (&$value, $key) {
if (is_string($key)) {
$value = $key . ': ' . new Type($value);
} else {
$value = new Type($value);
}
});
return '{' . implode(', ', $this->value) . '}';
}
}

View file

@ -5,13 +5,14 @@ declare(strict_types=1);
namespace Tests\Functions; namespace Tests\Functions;
use Arendsen\FluxQueryBuilder\Functions\Reduce; use Arendsen\FluxQueryBuilder\Functions\Reduce;
use Arendsen\FluxQueryBuilder\Type\Math;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
final class ReduceFunctionTest extends TestCase final class ReduceFunctionTest extends TestCase
{ {
public function testSimpleReduce() public function testSimpleReduce()
{ {
$expression = new Reduce(['sum' => 'r._value + accumulator.sum'], ['sum' => 0]); $expression = new Reduce(['sum' => new Math('r._value + accumulator.sum')], ['sum' => 0]);
$query = '|> reduce(fn: (r, accumulator) => ({sum: r._value + accumulator.sum}), identity: {sum: 0}) '; $query = '|> reduce(fn: (r, accumulator) => ({sum: r._value + accumulator.sum}), identity: {sum: 0}) ';

View file

@ -9,6 +9,7 @@ use Exception;
use Arendsen\FluxQueryBuilder\Expression\KeyValue; use Arendsen\FluxQueryBuilder\Expression\KeyValue;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Arendsen\FluxQueryBuilder\QueryBuilder; use Arendsen\FluxQueryBuilder\QueryBuilder;
use Arendsen\FluxQueryBuilder\Type\Math;
final class QueryBuilderTest extends TestCase final class QueryBuilderTest extends TestCase
{ {
@ -102,7 +103,7 @@ final class QueryBuilderTest extends TestCase
->addFilter(KeyValue::setEqualTo('_field', 'username')) ->addFilter(KeyValue::setEqualTo('_field', 'username'))
->addMap('r with name: r.user') ->addMap('r with name: r.user')
->addGroup(['_field', 'ip']) ->addGroup(['_field', 'ip'])
->addReduce(['count' => 'accumulator.count + 1'], ['count' => 0]) ->addReduce(['count' => new Math('accumulator.count + 1')], ['count' => 0])
->addFilter(KeyValue::setGreaterOrEqualTo('count', 1)->andGreaterOrEqualTo('count2', 2)); ->addFilter(KeyValue::setGreaterOrEqualTo('count', 1)->andGreaterOrEqualTo('count2', 2));
$expectedQuery = 'from(bucket: "test_bucket") |> range(start: time(v: 2022-08-12T17:31:00Z)) ' . $expectedQuery = 'from(bucket: "test_bucket") |> range(start: time(v: 2022-08-12T17:31:00Z)) ' .

View file

@ -31,6 +31,34 @@ final class FactoryTypeTest extends TestCase
'value', 'value',
'"value"', '"value"',
], ],
'Integer' => [
12345,
'12345'
],
'Boolean True' => [
true,
'true'
],
'Boolean False' => [
false,
'false'
],
'Array' => [
['hello', 'world'],
'"hello", "world"'
],
'Dictionary' => [
['hello' => 'world', 'foo' => 'bar'],
'hello: "world", foo: "bar"'
],
'Array Multidimensional' => [
['hello' => ['test', 'foo']],
'hello: ["test", "foo"]'
],
'Array Multidimensional 2' => [
['hello' => ['test' => 'bar', 'foo' => 'hi']],
'hello: [test: "bar", foo: "hi"]'
],
]; ];
} }
} }