Add new types Array, Boolean, Record, Math
Signed-off-by: davidarendsen <davidarendsen@hey.com>
This commit is contained in:
parent
a50e33ba04
commit
057a2d625e
10 changed files with 137 additions and 29 deletions
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace Arendsen\FluxQueryBuilder;
|
||||
|
||||
use Arendsen\FluxQueryBuilder\Type\ArrayType;
|
||||
use DateTime;
|
||||
use Arendsen\FluxQueryBuilder\Type\Time;
|
||||
|
||||
|
|
@ -9,12 +10,10 @@ class Formatters
|
|||
{
|
||||
public static function valueToString($value): string
|
||||
{
|
||||
if (is_string($value)) {
|
||||
return '"' . $value . '"';
|
||||
} elseif (is_bool($value)) {
|
||||
return $value ? 'true' : 'false';
|
||||
} elseif (is_array($value)) {
|
||||
return '[' . self::toFluxArrayString($value) . ']';
|
||||
if (is_array($value)) {
|
||||
return '[' . new ArrayType($value) . ']';
|
||||
} else {
|
||||
return new Type($value);
|
||||
}
|
||||
|
||||
return $value;
|
||||
|
|
@ -22,15 +21,7 @@ class Formatters
|
|||
|
||||
public static function toFluxArrayString(array $array): string
|
||||
{
|
||||
array_walk($array, function (&$value, $key) {
|
||||
if (is_string($key)) {
|
||||
$value = $key . ': ' . self::valueToString($value);
|
||||
} else {
|
||||
$value = self::valueToString($value);
|
||||
}
|
||||
});
|
||||
|
||||
return implode(', ', $array);
|
||||
return new ArrayType($array);
|
||||
}
|
||||
|
||||
public static function dateTimeToString(DateTime $dateTime): string
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
namespace Arendsen\FluxQueryBuilder\Functions;
|
||||
|
||||
use Arendsen\FluxQueryBuilder\Formatters;
|
||||
use Arendsen\FluxQueryBuilder\Type\Record;
|
||||
|
||||
class Reduce extends Base
|
||||
{
|
||||
|
|
@ -24,16 +25,8 @@ class Reduce extends Base
|
|||
|
||||
public function __toString()
|
||||
{
|
||||
return '|> reduce(fn: (r, accumulator) => ({' . implode(', ', $this->formatSettings($this->settings)) . '}), ' .
|
||||
'identity: {' . Formatters::toFluxArrayString($this->identity) . '}) ';
|
||||
return '|> reduce(fn: (r, accumulator) => (' . new Record($this->settings) . '), ' .
|
||||
'identity: ' . new Record($this->identity) . ') ';
|
||||
}
|
||||
|
||||
protected function formatSettings(array $settings)
|
||||
{
|
||||
array_walk($settings, function (&$value, $key) {
|
||||
$value = $key . ': ' . $value;
|
||||
});
|
||||
|
||||
return $settings;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
10
src/Type.php
10
src/Type.php
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace Arendsen\FluxQueryBuilder;
|
||||
|
||||
use Arendsen\FluxQueryBuilder\Type\ArrayType;
|
||||
use Arendsen\FluxQueryBuilder\Type\BooleanType;
|
||||
use Arendsen\FluxQueryBuilder\Type\Time;
|
||||
use DateTime;
|
||||
|
||||
|
|
@ -15,13 +17,17 @@ class Type
|
|||
public function __toString(): string
|
||||
{
|
||||
switch (gettype($this->value)) {
|
||||
case 'string':
|
||||
return '"' . $this->value . '"';
|
||||
case 'object':
|
||||
if ($this->value instanceof DateTime) {
|
||||
return new Time($this->value);
|
||||
}
|
||||
return $this->value->__toString();
|
||||
case 'string':
|
||||
return '"' . $this->value . '"';
|
||||
case 'boolean':
|
||||
return new BooleanType($this->value);
|
||||
case 'array':
|
||||
return new ArrayType($this->value);
|
||||
default:
|
||||
return (string)$this->value;
|
||||
}
|
||||
|
|
|
|||
27
src/Type/ArrayType.php
Normal file
27
src/Type/ArrayType.php
Normal 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
16
src/Type/BooleanType.php
Normal 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
19
src/Type/Math.php
Normal 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
26
src/Type/Record.php
Normal 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) . '}';
|
||||
}
|
||||
}
|
||||
|
|
@ -5,13 +5,14 @@ declare(strict_types=1);
|
|||
namespace Tests\Functions;
|
||||
|
||||
use Arendsen\FluxQueryBuilder\Functions\Reduce;
|
||||
use Arendsen\FluxQueryBuilder\Type\Math;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class ReduceFunctionTest extends TestCase
|
||||
{
|
||||
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}) ';
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ use Exception;
|
|||
use Arendsen\FluxQueryBuilder\Expression\KeyValue;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Arendsen\FluxQueryBuilder\QueryBuilder;
|
||||
use Arendsen\FluxQueryBuilder\Type\Math;
|
||||
|
||||
final class QueryBuilderTest extends TestCase
|
||||
{
|
||||
|
|
@ -102,7 +103,7 @@ final class QueryBuilderTest extends TestCase
|
|||
->addFilter(KeyValue::setEqualTo('_field', 'username'))
|
||||
->addMap('r with name: r.user')
|
||||
->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));
|
||||
|
||||
$expectedQuery = 'from(bucket: "test_bucket") |> range(start: time(v: 2022-08-12T17:31:00Z)) ' .
|
||||
|
|
|
|||
|
|
@ -31,6 +31,34 @@ final class FactoryTypeTest extends TestCase
|
|||
'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"]'
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
editor.link_modal.header
Reference in a new issue