xrfragment/dist/xrfragment.php/lib/xrfragment/Query.php
2023-08-04 09:11:26 +02:00

393 lines
13 KiB
PHP

<?php
/**
*/
namespace xrfragment;
use \php\_Boot\HxAnon;
use \php\Boot;
use \php\_Boot\HxString;
class Query {
/**
* @var \EReg
*/
public $isClass;
/**
* @var \EReg
*/
public $isExclude;
/**
* @var \EReg
*/
public $isNumber;
/**
* @var \EReg
*/
public $isProp;
/**
* @var \EReg
*/
public $isRoot;
/**
* @var mixed
*/
public $q;
/**
* @var string
* # Spec
*
* > version 1.0.0 [![Actions Status](https://github.com/coderofsalvation/xrfragment/workflows/test/badge.svg)](https://github.com/coderofsalvation/xrfragment/actions) generated by `make doc` @ $(date +"%Y-%m-%dT%H:%M:%S%z")
*
* In case your programming language has no parser ([check here](https://github.com/coderofsalvation/xrfragment/tree/main/dist)) you can [crosscompile it](https://github.com/coderofsalvation/xrfragment/blob/main/build.hxml), or roll your own `Query.parse(str)` using the spec:
*/
public $str;
/**
* @param string $str
*
* @return void
*/
public function __construct ($str) {
#src/xrfragment/Query.hx:59: characters 36-49
$this->isNumber = new \EReg("^[0-9\\.]+\$", "");
#src/xrfragment/Query.hx:58: characters 36-50
$this->isClass = new \EReg("^[-]?class\$", "");
#src/xrfragment/Query.hx:57: characters 36-46
$this->isRoot = new \EReg("^[-]?/", "");
#src/xrfragment/Query.hx:56: characters 36-41
$this->isExclude = new \EReg("^-", "");
#src/xrfragment/Query.hx:55: characters 36-50
$this->isProp = new \EReg("^.*:[><=!]?", "");
#src/xrfragment/Query.hx:54: characters 47-49
$this->q = new HxAnon();
#src/xrfragment/Query.hx:53: characters 28-30
$this->str = "";
#src/xrfragment/Query.hx:62: characters 5-39
if ($str !== null) {
#src/xrfragment/Query.hx:62: characters 24-39
$this->parse($str);
}
}
/**
* @param string $token
*
* @return string
*/
public function expandAliases ($token) {
#src/xrfragment/Query.hx:71: characters 5-33
$classAlias = new \EReg("^(-)?\\.", "");
#src/xrfragment/Query.hx:72: characters 12-85
if ($classAlias->match($token)) {
#src/xrfragment/Query.hx:72: characters 38-77
return \StringTools::replace($token, ".", "class:");
} else {
#src/xrfragment/Query.hx:72: characters 80-85
return $token;
}
}
/**
* @return mixed
*/
public function get () {
#src/xrfragment/Query.hx:76: characters 5-18
return $this->q;
}
/**
* @param string $str
*
* @return mixed
*/
public function parse ($str) {
#src/xrfragment/Query.hx:79: lines 79-126
$_gthis = $this;
#src/xrfragment/Query.hx:81: characters 5-32
$token = HxString::split($str, " ");
#src/xrfragment/Query.hx:82: characters 5-44
$q = new HxAnon();
#src/xrfragment/Query.hx:84: lines 84-123
$process = function ($str, $prefix = "") use (&$_gthis, &$q) {
if ($prefix === null) {
$prefix = "";
}
#src/xrfragment/Query.hx:85: characters 7-34
$str = \trim($str);
#src/xrfragment/Query.hx:86: characters 7-40
$k = (HxString::split($str, ":")->arr[0] ?? null);
#src/xrfragment/Query.hx:87: characters 7-40
$v = (HxString::split($str, ":")->arr[1] ?? null);
#src/xrfragment/Query.hx:89: characters 7-51
$filter = new HxAnon();
#src/xrfragment/Query.hx:90: characters 7-53
if (\Reflect::field($q, ($prefix??'null') . ($k??'null'))) {
#src/xrfragment/Query.hx:90: characters 29-53
$filter = \Reflect::field($q, ($prefix??'null') . ($k??'null'));
}
#src/xrfragment/Query.hx:91: characters 7-89
$value = (\Reflect::field($filter, "rules") !== null ? \Reflect::field($filter, "rules") : new \Array_hx());
\Reflect::setField($filter, "rules", $value);
#src/xrfragment/Query.hx:93: lines 93-122
if ($_gthis->isProp->match($str)) {
#src/xrfragment/Query.hx:94: characters 9-30
$oper = "";
#src/xrfragment/Query.hx:95: characters 9-49
if (HxString::indexOf($str, "*") !== -1) {
#src/xrfragment/Query.hx:95: characters 39-49
$oper = "*";
}
#src/xrfragment/Query.hx:96: characters 9-49
if (HxString::indexOf($str, ">") !== -1) {
#src/xrfragment/Query.hx:96: characters 39-49
$oper = ">";
}
#src/xrfragment/Query.hx:97: characters 9-49
if (HxString::indexOf($str, "<") !== -1) {
#src/xrfragment/Query.hx:97: characters 39-49
$oper = "<";
}
#src/xrfragment/Query.hx:98: characters 9-50
if (HxString::indexOf($str, ">=") !== -1) {
#src/xrfragment/Query.hx:98: characters 39-50
$oper = ">=";
}
#src/xrfragment/Query.hx:99: characters 9-50
if (HxString::indexOf($str, "<=") !== -1) {
#src/xrfragment/Query.hx:99: characters 39-50
$oper = "<=";
}
#src/xrfragment/Query.hx:100: lines 100-103
if ($_gthis->isExclude->match($k)) {
#src/xrfragment/Query.hx:101: characters 11-22
$oper = "!=";
#src/xrfragment/Query.hx:102: characters 15-26
$k = \mb_substr($k, 1, null);
} else {
#src/xrfragment/Query.hx:103: characters 19-40
$v = \mb_substr($v, mb_strlen($oper), null);
}
#src/xrfragment/Query.hx:104: characters 9-42
if (mb_strlen($oper) === 0) {
#src/xrfragment/Query.hx:104: characters 32-42
$oper = "=";
}
#src/xrfragment/Query.hx:105: lines 105-114
if ($_gthis->isClass->match($k)) {
#src/xrfragment/Query.hx:106: characters 11-45
$value = $oper !== "!=";
\Reflect::setField($filter, ($prefix??'null') . ($k??'null'), $value);
#src/xrfragment/Query.hx:107: characters 11-26
\Reflect::setField($q, $v, $filter);
} else {
#src/xrfragment/Query.hx:109: characters 11-53
$rule = new HxAnon();
#src/xrfragment/Query.hx:110: lines 110-111
if ($_gthis->isNumber->match($v)) {
#src/xrfragment/Query.hx:110: characters 35-67
$value = \Std::parseFloat($v);
\Reflect::setField($rule, $oper, $value);
} else {
#src/xrfragment/Query.hx:111: characters 16-30
\Reflect::setField($rule, $oper, $v);
}
#src/xrfragment/Query.hx:112: characters 11-39
\Reflect::field($filter, "rules")->push($rule);
#src/xrfragment/Query.hx:113: characters 11-29
\Reflect::setField($q, $k, $filter);
}
#src/xrfragment/Query.hx:115: characters 9-15
return;
} else {
#src/xrfragment/Query.hx:117: characters 9-62
$value = ($_gthis->isExclude->match($str) ? false : true);
\Reflect::setField($filter, "id", $value);
#src/xrfragment/Query.hx:118: characters 9-63
$value = $_gthis->isRoot->match($str);
\Reflect::setField($filter, "root", $value);
#src/xrfragment/Query.hx:119: characters 9-55
if ($_gthis->isExclude->match($str)) {
#src/xrfragment/Query.hx:119: characters 42-55
$str = \mb_substr($str, 1, null);
}
#src/xrfragment/Query.hx:120: characters 9-55
if ($_gthis->isRoot->match($str)) {
#src/xrfragment/Query.hx:120: characters 42-55
$str = \mb_substr($str, 1, null);
}
#src/xrfragment/Query.hx:121: characters 9-29
\Reflect::setField($q, $str, $filter);
}
};
#src/xrfragment/Query.hx:124: characters 15-19
$_g = 0;
#src/xrfragment/Query.hx:124: characters 19-31
$_g1 = $token->length;
#src/xrfragment/Query.hx:124: characters 5-68
while ($_g < $_g1) {
#src/xrfragment/Query.hx:124: characters 15-31
$i = $_g++;
#src/xrfragment/Query.hx:124: characters 34-68
$process($this->expandAliases(($token->arr[$i] ?? null)));
}
#src/xrfragment/Query.hx:125: characters 5-22
return $this->q = $q;
}
/**
* @param mixed $obj
*
* @return bool
*/
public function test ($obj = null) {
#src/xrfragment/Query.hx:130: characters 5-30
$qualify = false;
#src/xrfragment/Query.hx:132: lines 132-135
$_g = 0;
$_g1 = \Reflect::fields($obj);
while ($_g < $_g1->length) {
#src/xrfragment/Query.hx:132: characters 11-12
$k = ($_g1->arr[$_g] ?? null);
#src/xrfragment/Query.hx:132: lines 132-135
++$_g;
#src/xrfragment/Query.hx:133: characters 7-57
$v = \Std::string(\Reflect::field($obj, $k));
#src/xrfragment/Query.hx:134: characters 7-47
if ($this->testProperty($k, $v)) {
#src/xrfragment/Query.hx:134: characters 33-47
$qualify = true;
}
}
#src/xrfragment/Query.hx:136: lines 136-139
$_g = 0;
$_g1 = \Reflect::fields($obj);
while ($_g < $_g1->length) {
#src/xrfragment/Query.hx:136: characters 11-12
$k = ($_g1->arr[$_g] ?? null);
#src/xrfragment/Query.hx:136: lines 136-139
++$_g;
#src/xrfragment/Query.hx:137: characters 7-57
$v = \Std::string(\Reflect::field($obj, $k));
#src/xrfragment/Query.hx:138: characters 7-54
if ($this->testProperty($k, $v, true)) {
#src/xrfragment/Query.hx:138: characters 39-54
$qualify = false;
}
}
#src/xrfragment/Query.hx:140: characters 5-19
return $qualify;
}
/**
* @param string $property
* @param string $value
* @param bool $exclude
*
* @return bool
*/
public function testProperty ($property, $value, $exclude = null) {
#src/xrfragment/Query.hx:145: characters 5-23
$conds = 0;
#src/xrfragment/Query.hx:146: characters 5-23
$fails = 0;
#src/xrfragment/Query.hx:147: characters 5-26
$qualify = 0;
#src/xrfragment/Query.hx:149: lines 149-153
$testprop = function ($expr) use (&$conds, &$fails) {
#src/xrfragment/Query.hx:150: characters 7-15
$conds += 1;
#src/xrfragment/Query.hx:151: characters 7-27
$fails += ($expr ? 0 : 1);
#src/xrfragment/Query.hx:152: characters 7-18
return $expr;
};
#src/xrfragment/Query.hx:156: lines 156-159
if (\Reflect::field($this->q, $value) !== null) {
#src/xrfragment/Query.hx:157: characters 7-52
$v = \Reflect::field($this->q, $value);
#src/xrfragment/Query.hx:158: characters 7-59
if (\Reflect::field($v, $property) !== null) {
#src/xrfragment/Query.hx:158: characters 37-59
return \Reflect::field($v, $property);
}
}
#src/xrfragment/Query.hx:162: lines 162-183
$_g = 0;
$_g1 = \Reflect::fields($this->q);
while ($_g < $_g1->length) {
#src/xrfragment/Query.hx:162: characters 11-12
$k = ($_g1->arr[$_g] ?? null);
#src/xrfragment/Query.hx:162: lines 162-183
++$_g;
#src/xrfragment/Query.hx:163: characters 7-47
$filter = \Reflect::field($this->q, $k);
#src/xrfragment/Query.hx:164: characters 7-43
if (Boot::dynamicField($filter, 'rules') === null) {
#src/xrfragment/Query.hx:164: characters 35-43
continue;
}
#src/xrfragment/Query.hx:165: characters 7-47
$rules = Boot::dynamicField($filter, 'rules');
#src/xrfragment/Query.hx:167: lines 167-182
$_g2 = 0;
while ($_g2 < $rules->length) {
#src/xrfragment/Query.hx:167: characters 12-16
$rule = ($rules->arr[$_g2] ?? null);
#src/xrfragment/Query.hx:167: lines 167-182
++$_g2;
#src/xrfragment/Query.hx:169: lines 169-181
if ($exclude) {
#src/xrfragment/Query.hx:170: characters 11-145
if ((\Reflect::field($rule, "!=") !== null) && $testprop(\Std::string($value) === \Std::string(\Reflect::field($rule, "!="))) && $exclude) {
#src/xrfragment/Query.hx:170: characters 133-145
++$qualify;
}
} else {
#src/xrfragment/Query.hx:172: characters 11-141
if ((\Reflect::field($rule, "*") !== null) && $testprop(\Std::parseFloat($value) !== null)) {
#src/xrfragment/Query.hx:172: characters 129-141
++$qualify;
}
#src/xrfragment/Query.hx:173: characters 11-143
if ((\Reflect::field($rule, ">") !== null) && $testprop(\Std::parseFloat($value) > \Std::parseFloat(\Reflect::field($rule, ">")))) {
#src/xrfragment/Query.hx:173: characters 131-143
++$qualify;
}
#src/xrfragment/Query.hx:174: characters 11-143
if ((\Reflect::field($rule, "<") !== null) && $testprop(\Std::parseFloat($value) < \Std::parseFloat(\Reflect::field($rule, "<")))) {
#src/xrfragment/Query.hx:174: characters 131-143
++$qualify;
}
#src/xrfragment/Query.hx:175: characters 11-143
if ((\Reflect::field($rule, ">=") !== null) && $testprop(\Std::parseFloat($value) >= \Std::parseFloat(\Reflect::field($rule, ">=")))) {
#src/xrfragment/Query.hx:175: characters 131-143
++$qualify;
}
#src/xrfragment/Query.hx:176: characters 11-143
if ((\Reflect::field($rule, "<=") !== null) && $testprop(\Std::parseFloat($value) <= \Std::parseFloat(\Reflect::field($rule, "<=")))) {
#src/xrfragment/Query.hx:176: characters 131-143
++$qualify;
}
#src/xrfragment/Query.hx:177: lines 177-180
if ((\Reflect::field($rule, "=") !== null) && ($testprop($value === \Reflect::field($rule, "=")) || $testprop(Boot::equal(\Std::parseFloat($value), \Std::parseFloat(\Reflect::field($rule, "=")))))) {
#src/xrfragment/Query.hx:180: characters 14-26
++$qualify;
}
}
}
}
#src/xrfragment/Query.hx:184: characters 5-23
return $qualify > 0;
}
/**
* @return mixed
*/
public function toObject () {
#src/xrfragment/Query.hx:66: characters 5-18
return $this->q;
}
}
Boot::registerClass(Query::class, 'xrfragment.Query');