1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- <?php
- namespace JmesPath;
- /**
- * Uses an external tree visitor to interpret an AST.
- */
- class AstRuntime
- {
- private $parser;
- private $interpreter;
- private $cache = [];
- private $cachedCount = 0;
- public function __construct(
- Parser $parser = null,
- callable $fnDispatcher = null
- ) {
- $fnDispatcher = $fnDispatcher ?: FnDispatcher::getInstance();
- $this->interpreter = new TreeInterpreter($fnDispatcher);
- $this->parser = $parser ?: new Parser();
- }
- /**
- * Returns data from the provided input that matches a given JMESPath
- * expression.
- *
- * @param string $expression JMESPath expression to evaluate
- * @param mixed $data Data to search. This data should be data that
- * is similar to data returned from json_decode
- * using associative arrays rather than objects.
- *
- * @return mixed Returns the matching data or null
- */
- public function __invoke($expression, $data)
- {
- if (!isset($this->cache[$expression])) {
- // Clear the AST cache when it hits 1024 entries
- if (++$this->cachedCount > 1024) {
- $this->cache = [];
- $this->cachedCount = 0;
- }
- $this->cache[$expression] = $this->parser->parse($expression);
- }
- return $this->interpreter->visit($this->cache[$expression], $data);
- }
- }
|