393 lines
13 KiB
PHP
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 [](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');
|