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;
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

View file

@ -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;
}
}

View file

@ -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
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) . '}';
}
}