This is a (somewhat) lightweight library to parse and execute predicate-based structure algorithms.
A useful application example is dynamic sorting.
Add this to composer.json
:
"require": {
"adeptoas/predicatree": "^1.0.0"
}
Make sure to merge your require
-blocks!
Currently only supports sorting.
Programs
are sequences of predicates executed in order to give some kind of result.
You can create your own by extending from Adepto\PredicaTree\Program\Program
.
Be sure to call the constructor:
protected function __construct($subject, array $predicates, array $aprioriData = [])
It is marked as protected
to encourage use of static factory methods.
Some pre-defined programs are explained below.
Every program is run by calling $program->run()
. Be aware that this only executes the program.
If you actually want to retrieve the computation result, you have to call $program->getResult()
,
which will run the program automatically (if not already done).
Every program has a subject
which is the data the program operates on.
A program can have optional apriori
data, which is an array specifying any value you want
Sorting programs are generated by SortProgram::build(array $data)
.
The data array is specified as follows:
[
'apriori' => array,
'collection' => [
'a collection specifier (see section below)'
],
'predicates' => [
'a sequential list',
'of if-then predicates',
'just as specified below'
]
]
In order to sort stuff, you have to give it order. Therefor, this library contains some collection types.
Features basic sort operations like add
, remove
and move
.
Collections are specified by their type (currently Dictionary
and OrderedSet
) and their items like so:
[
'type' => 'OrderedSet',
'items' => [1, 3, 7, 9, 11]
]
Predicates represent the if-then
rules in this package, and are specified as follows:
[
'if' => [
'condition' => 'CONDITION-NAME',
'arguments' => ['all', 'arguments', 'for', 'the', 'condition']
],
'then' => [
'action' => 'ACTION-NAME',
'arguments' => ['all', 'arguments', 'for', 'the', 'action']
]
]
Please note that arguments are passed as sequential arrays and thus are order-sensitive
Pre-defined conditions
EQUAL
: two (obvious) arguments, plus an optional boolean for strict comparisonBETWEEN
: needle followed by two boundariesIN
: needle and haystack, plus an optional boolean for strict comparisonSTR-BEGINS
: needle and haystackSTR-CONTAINS
: needle and haystackSTR-ENDS
: needle and haystackNOT
: a fully specified predicate (as array). Attention: Sequential array with one argument formatted as array means double array braces!!AND
: any amount of conditions specified as arrayOR
: any amount of conditions specified as array
Currently features methods:
COLLECTION
: first argument is collection method, followed by whatever more arguments necessaryEVAL
: a fully specified predicate (as array)PRINT
: a string and an optional second boolean for applying JSON encodingCHAIN
: any amount of actions specified as array
Apriori contents can be accessed by prefixing an argument with ::
.
Nested array access can be realised by infixing the same ::
in between keys.
Subject contents can be accessed during program execution by prefixing an argument with __
.
The part after this marker specifies the exact key under which the collection will be accessed.
Plain __
accesses the entire collection contents as array
Examples will be added to the Examples/
directory once I come up with meaningful examples that don't involve confidential data from my dayjob.