Rule engine and search engine now use the same operators; making them interchangeable.

This commit is contained in:
James Cole
2020-08-21 08:23:44 +02:00
parent 3081911eae
commit d69934ca8f
11 changed files with 141 additions and 165 deletions

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\IsBoolean; use FireflyIII\Rules\IsBoolean;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\GetRuleConfiguration;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
use function is_array; use function is_array;
@@ -35,7 +36,8 @@ use function is_array;
*/ */
class RuleStoreRequest extends FormRequest class RuleStoreRequest extends FormRequest
{ {
use ConvertsDataTypes; use ConvertsDataTypes, GetRuleConfiguration;
/** /**
* Authorize logged in users. * Authorize logged in users.
* *
@@ -88,11 +90,11 @@ class RuleStoreRequest extends FormRequest
*/ */
public function rules(): array public function rules(): array
{ {
$validTriggers = array_keys(config('firefly.rule-triggers')); $validTriggers = $this->getTriggers();
$validActions = array_keys(config('firefly.rule-actions')); $validActions = array_keys(config('firefly.rule-actions'));
// some triggers and actions require text: // some triggers and actions require text:
$contextTriggers = implode(',', config('firefly.context-rule-triggers')); $contextTriggers = implode(',', $this->getTriggersWithContext());
$contextActions = implode(',', config('firefly.context-rule-actions')); $contextActions = implode(',', config('firefly.context-rule-actions'));
return [ return [

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Api\V1\Requests;
use FireflyIII\Rules\IsBoolean; use FireflyIII\Rules\IsBoolean;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\GetRuleConfiguration;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
use function is_array; use function is_array;
@@ -35,7 +36,7 @@ use function is_array;
*/ */
class RuleUpdateRequest extends FormRequest class RuleUpdateRequest extends FormRequest
{ {
use ConvertsDataTypes; use ConvertsDataTypes, GetRuleConfiguration;
/** /**
* Authorize logged in users. * Authorize logged in users.
* *
@@ -88,12 +89,12 @@ class RuleUpdateRequest extends FormRequest
*/ */
public function rules(): array public function rules(): array
{ {
$validTriggers = array_keys(config('firefly.rule-triggers')); $validTriggers = $this->getTriggers();
$validActions = array_keys(config('firefly.rule-actions')); $validActions = array_keys(config('firefly.rule-actions'));
$rule = $this->route()->parameter('rule'); $rule = $this->route()->parameter('rule');
// some triggers and actions require text: // some triggers and actions require text:
$contextTriggers = implode(',', config('firefly.context-rule-triggers')); $contextTriggers = implode(',', $this->getTriggersWithContext());
$contextActions = implode(',', config('firefly.context-rule-actions')); $contextActions = implode(',', config('firefly.context-rule-actions'));
return [ return [

View File

@@ -73,7 +73,7 @@ class RuleController extends Controller
public function trigger(Request $request): JsonResponse public function trigger(Request $request): JsonResponse
{ {
$count = (int) $request->get('count') > 0 ? (int) $request->get('count') : 1; $count = (int) $request->get('count') > 0 ? (int) $request->get('count') : 1;
$keys = array_keys(config('firefly.rule-triggers')); $keys = array_keys(config('firefly.search.operators'));
$triggers = []; $triggers = [];
foreach ($keys as $key) { foreach ($keys as $key) {
if ('user_action' !== $key) { if ('user_action' !== $key) {

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Http\Requests;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\GetRuleConfiguration;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
/** /**
@@ -31,7 +32,7 @@ use Illuminate\Foundation\Http\FormRequest;
*/ */
class RuleFormRequest extends FormRequest class RuleFormRequest extends FormRequest
{ {
use ConvertsDataTypes; use ConvertsDataTypes, GetRuleConfiguration;
/** /**
* Verify the request. * Verify the request.
* *
@@ -73,14 +74,14 @@ class RuleFormRequest extends FormRequest
*/ */
public function rules(): array public function rules(): array
{ {
$validTriggers = array_keys(config('firefly.rule-triggers')); $validTriggers = $this->getTriggers();
$validActions = array_keys(config('firefly.rule-actions')); $validActions = array_keys(config('firefly.rule-actions'));
// some actions require text (aka context): // some actions require text (aka context):
$contextActions = implode(',', config('firefly.context-rule-actions')); $contextActions = implode(',', config('firefly.context-rule-actions'));
// some triggers require text (aka context): // some triggers require text (aka context):
$contextTriggers = implode(',', config('firefly.context-rule-triggers')); $contextTriggers = implode(',', $this->getTriggersWithContext());
// initial set of rules: // initial set of rules:
$rules = [ $rules = [

View File

@@ -22,6 +22,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Requests; namespace FireflyIII\Http\Requests;
use FireflyIII\Support\Request\GetRuleConfiguration;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
/** /**
@@ -31,6 +32,7 @@ use Illuminate\Foundation\Http\FormRequest;
*/ */
class TestRuleFormRequest extends FormRequest class TestRuleFormRequest extends FormRequest
{ {
use GetRuleConfiguration;
/** /**
* Verify the request. * Verify the request.
* *
@@ -51,7 +53,7 @@ class TestRuleFormRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
// fixed // fixed
$validTriggers = array_keys(config('firefly.rule-triggers')); $validTriggers = $this->getTriggers();
$rules = [ $rules = [
'rule-trigger.*' => 'required|min:1|in:' . implode(',', $validTriggers), 'rule-trigger.*' => 'required|min:1|in:' . implode(',', $validTriggers),
'rule-trigger-value.*' => 'required|min:1|ruleTriggerValue', 'rule-trigger-value.*' => 'required|min:1|ruleTriggerValue',

View File

@@ -49,6 +49,6 @@ class Domain
*/ */
public static function getRuleTriggers(): array public static function getRuleTriggers(): array
{ {
return config('firefly.rule-triggers'); return array_keys(config('firefly.search.operators'));
} }
} }

View File

@@ -0,0 +1,52 @@
<?php
/*
* GetRuleConfiguration.php
* Copyright (c) 2020 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Support\Request;
/**
* Trait GetRuleConfiguration
*/
trait GetRuleConfiguration
{
/**
* @return array
*/
protected function getTriggers(): array
{
return array_keys(config('firefly.search.operators'));
}
/**
* @return array
*/
protected function getTriggersWithContext(): array
{
$list = config('firefly.search.operators');
$return = [];
foreach ($list as $key => $info) {
if (true === $info['needs_context']) {
$return[] = $key;
}
}
return $return;
}
}

View File

@@ -77,7 +77,7 @@ class Rule extends AbstractExtension
return new TwigFunction( return new TwigFunction(
'allRuleTriggers', 'allRuleTriggers',
static function () { static function () {
$ruleTriggers = array_keys(Config::get('firefly.rule-triggers')); $ruleTriggers = array_keys(config('firefly.search.operators'));;
$possibleTriggers = []; $possibleTriggers = [];
foreach ($ruleTriggers as $key) { foreach ($ruleTriggers as $key) {
if ('user_action' !== $key) { if ('user_action' !== $key) {

View File

@@ -37,7 +37,7 @@ use Log;
class TriggerFactory class TriggerFactory
{ {
/** @var array array with trigger types */ /** @var array array with trigger types */
protected static $triggerTypes = []; protected static array $triggerTypes = [];
/** /**
* Returns the trigger for the given type and journal. This method returns the actual implementation * Returns the trigger for the given type and journal. This method returns the actual implementation

View File

@@ -351,7 +351,7 @@ class FireflyValidator extends Validator
} }
// and finally a "will match everything check": // and finally a "will match everything check":
$classes = app('config')->get('firefly.rule-triggers'); $classes = array_keys(config('firefly.search.operators'));;
/** @var TriggerInterface $class */ /** @var TriggerInterface $class */
$class = $classes[$triggerType] ?? false; $class = $classes[$triggerType] ?? false;
if (false === $class) { if (false === $class) {

View File

@@ -445,59 +445,6 @@ return [
'configName' => ConfigurationName::class, 'configName' => ConfigurationName::class,
], ],
'rule-triggers' => [
'user_action' => UserAction::class,
'from_account_starts' => FromAccountStarts::class,
'from_account_ends' => FromAccountEnds::class,
'from_account_is' => FromAccountIs::class,
'from_account_contains' => FromAccountContains::class,
'from_account_nr_starts' => FromAccountNumberStarts::class,
'from_account_nr_ends' => FromAccountNumberEnds::class,
'from_account_nr_is' => FromAccountNumberIs::class,
'from_account_nr_contains' => FromAccountNumberContains::class,
'to_account_starts' => ToAccountStarts::class,
'to_account_ends' => ToAccountEnds::class,
'to_account_is' => ToAccountIs::class,
'to_account_contains' => ToAccountContains::class,
'to_account_nr_starts' => ToAccountNumberStarts::class,
'to_account_nr_ends' => ToAccountNumberEnds::class,
'to_account_nr_is' => ToAccountNumberIs::class,
'to_account_nr_contains' => ToAccountNumberContains::class,
'amount_less' => AmountLess::class,
'amount_exactly' => AmountExactly::class,
'amount_more' => AmountMore::class,
'description_starts' => DescriptionStarts::class,
'description_ends' => DescriptionEnds::class,
'description_contains' => DescriptionContains::class,
'description_is' => DescriptionIs::class,
'date_is' => DateIs::class,
'date_before' => DateBefore::class,
'date_after' => DateAfter::class,
'transaction_type' => TransactionType::class,
'category_is' => CategoryIs::class,
'budget_is' => BudgetIs::class,
'tag_is' => TagIs::class,
'currency_is' => CurrencyIs::class,
'foreign_currency_is' => ForeignCurrencyIs::class,
'has_attachments' => HasAttachment::class,
'has_no_category' => HasNoCategory::class,
'has_any_category' => HasAnyCategory::class,
'has_no_budget' => HasNoBudget::class,
'has_any_budget' => HasAnyBudget::class,
'has_no_tag' => HasNoTag::class,
'has_any_tag' => HasAnyTag::class,
'notes_contain' => NotesContain::class,
'notes_start' => NotesStart::class,
'notes_end' => NotesEnd::class,
'notes_are' => NotesAre::class,
'no_notes' => NotesEmpty::class,
'any_notes' => NotesAny::class,
'bill_is' => BillIs::class, // TODO
'created_on' => CreatedOn::class, // TODO
'updated_on' => UpdatedOn::class,// TODO
'external_id' => ExternalId::class,// TODO
'internal_reference' => InternalReference::class, // TODO
],
'rule-actions' => [ 'rule-actions' => [
'set_category' => SetCategory::class, 'set_category' => SetCategory::class,
'clear_category' => ClearCategory::class, 'clear_category' => ClearCategory::class,
@@ -540,35 +487,6 @@ return [
//'convert_deposit', //'convert_deposit',
'convert_transfer', 'convert_transfer',
], ],
'context-rule-triggers' => [
'from_account_starts',
'from_account_ends',
'from_account_is',
'from_account_contains',
'to_account_starts',
'to_account_ends',
'to_account_is',
'to_account_contains',
'amount_less',
'amount_exactly',
'amount_more',
'description_starts',
'description_ends',
'description_contains',
'description_is',
'transaction_type',
'category_is',
'budget_is',
'tag_is',
'currency_is',
'notes_contain',
'notes_start',
'notes_end',
'notes_are',
'date_is',
'date_before',
'date_after',
],
'test-triggers' => [ 'test-triggers' => [
'limit' => 10, 'limit' => 10,
@@ -580,95 +498,95 @@ return [
'search' => [ 'search' => [
'operators' => [ 'operators' => [
'user_action' => ['alias' => false, 'trigger_class' => UserAction::class], 'user_action' => ['alias' => false, 'trigger_class' => UserAction::class, 'needs_context' => true,],
'from_account_starts' => ['alias' => false, 'trigger_class' => FromAccountStarts::class], 'from_account_starts' => ['alias' => false, 'trigger_class' => FromAccountStarts::class, 'needs_context' => true,],
'from_account_ends' => ['alias' => false, 'trigger_class' => FromAccountEnds::class], 'from_account_ends' => ['alias' => false, 'trigger_class' => FromAccountEnds::class, 'needs_context' => true,],
'from_account_contains' => ['alias' => false, 'trigger_class' => FromAccountContains::class], 'from_account_contains' => ['alias' => false, 'trigger_class' => FromAccountContains::class, 'needs_context' => true,],
'from_account_nr_starts' => ['alias' => false, 'trigger_class' => FromAccountNumberStarts::class], 'from_account_nr_starts' => ['alias' => false, 'trigger_class' => FromAccountNumberStarts::class, 'needs_context' => true,],
'from_account_nr_ends' => ['alias' => false, 'trigger_class' => FromAccountNumberEnds::class], 'from_account_nr_ends' => ['alias' => false, 'trigger_class' => FromAccountNumberEnds::class, 'needs_context' => true,],
'from_account_nr_is' => ['alias' => false, 'trigger_class' => FromAccountNumberIs::class], 'from_account_nr_is' => ['alias' => false, 'trigger_class' => FromAccountNumberIs::class, 'needs_context' => true,],
'from_account_nr_contains' => ['alias' => false, 'trigger_class' => FromAccountNumberContains::class], 'from_account_nr_contains' => ['alias' => false, 'trigger_class' => FromAccountNumberContains::class, 'needs_context' => true,],
'to_account_starts' => ['alias' => false, 'trigger_class' => ToAccountStarts::class], 'to_account_starts' => ['alias' => false, 'trigger_class' => ToAccountStarts::class, 'needs_context' => true,],
'to_account_ends' => ['alias' => false, 'trigger_class' => ToAccountEnds::class], 'to_account_ends' => ['alias' => false, 'trigger_class' => ToAccountEnds::class, 'needs_context' => true,],
'to_account_contains' => ['alias' => false, 'trigger_class' => ToAccountContains::class], 'to_account_contains' => ['alias' => false, 'trigger_class' => ToAccountContains::class, 'needs_context' => true,],
'to_account_nr_starts' => ['alias' => false, 'trigger_class' => ToAccountNumberStarts::class], 'to_account_nr_starts' => ['alias' => false, 'trigger_class' => ToAccountNumberStarts::class, 'needs_context' => true,],
'to_account_nr_ends' => ['alias' => false, 'trigger_class' => ToAccountNumberEnds::class], 'to_account_nr_ends' => ['alias' => false, 'trigger_class' => ToAccountNumberEnds::class, 'needs_context' => true,],
'to_account_nr_is' => ['alias' => false, 'trigger_class' => ToAccountNumberIs::class], 'to_account_nr_is' => ['alias' => false, 'trigger_class' => ToAccountNumberIs::class, 'needs_context' => true,],
'to_account_nr_contains' => ['alias' => false, 'trigger_class' => ToAccountNumberContains::class], 'to_account_nr_contains' => ['alias' => false, 'trigger_class' => ToAccountNumberContains::class, 'needs_context' => true,],
'description_starts' => ['alias' => false, 'trigger_class' => DescriptionStarts::class], 'description_starts' => ['alias' => false, 'trigger_class' => DescriptionStarts::class, 'needs_context' => true,],
'description_ends' => ['alias' => false, 'trigger_class' => DescriptionEnds::class], 'description_ends' => ['alias' => false, 'trigger_class' => DescriptionEnds::class, 'needs_context' => true,],
'description_contains' => ['alias' => false, 'trigger_class' => DescriptionContains::class], 'description_contains' => ['alias' => false, 'trigger_class' => DescriptionContains::class, 'needs_context' => true,],
'description_is' => ['alias' => false, 'trigger_class' => DescriptionIs::class], 'description_is' => ['alias' => false, 'trigger_class' => DescriptionIs::class, 'needs_context' => true,],
'currency_is' => ['alias' => false, 'trigger_class' => CurrencyIs::class], 'currency_is' => ['alias' => false, 'trigger_class' => CurrencyIs::class, 'needs_context' => true,],
'foreign_currency_is' => ['alias' => false, 'trigger_class' => ForeignCurrencyIs::class], 'foreign_currency_is' => ['alias' => false, 'trigger_class' => ForeignCurrencyIs::class, 'needs_context' => true,],
'has_attachments' => ['alias' => false, 'trigger_class' => HasAttachment::class], 'has_attachments' => ['alias' => false, 'trigger_class' => HasAttachment::class, 'needs_context' => false,],
'has_no_category' => ['alias' => false, 'trigger_class' => HasNoCategory::class], 'has_no_category' => ['alias' => false, 'trigger_class' => HasNoCategory::class, 'needs_context' => false,],
'has_any_category' => ['alias' => false, 'trigger_class' => HasAnyCategory::class], 'has_any_category' => ['alias' => false, 'trigger_class' => HasAnyCategory::class, 'needs_context' => false,],
'has_no_budget' => ['alias' => false, 'trigger_class' => HasNoBudget::class], 'has_no_budget' => ['alias' => false, 'trigger_class' => HasNoBudget::class, 'needs_context' => false,],
'has_any_budget' => ['alias' => false, 'trigger_class' => HasAnyBudget::class], 'has_any_budget' => ['alias' => false, 'trigger_class' => HasAnyBudget::class, 'needs_context' => false,],
'has_no_tag' => ['alias' => false, 'trigger_class' => HasNoTag::class], 'has_no_tag' => ['alias' => false, 'trigger_class' => HasNoTag::class, 'needs_context' => false,],
'has_any_tag' => ['alias' => false, 'trigger_class' => HasAnyTag::class], 'has_any_tag' => ['alias' => false, 'trigger_class' => HasAnyTag::class, 'needs_context' => false,],
'notes_contain' => ['alias' => false, 'trigger_class' => NotesContain::class], 'notes_contain' => ['alias' => false, 'trigger_class' => NotesContain::class, 'needs_context' => true,],
'notes_start' => ['alias' => false, 'trigger_class' => NotesStart::class], 'notes_start' => ['alias' => false, 'trigger_class' => NotesStart::class, 'needs_context' => true,],
'notes_end' => ['alias' => false, 'trigger_class' => NotesEnd::class], 'notes_end' => ['alias' => false, 'trigger_class' => NotesEnd::class, 'needs_context' => true,],
'notes_are' => ['alias' => false, 'trigger_class' => NotesAre::class], 'notes_are' => ['alias' => false, 'trigger_class' => NotesAre::class, 'needs_context' => true,],
'no_notes' => ['alias' => false, 'trigger_class' => NotesEmpty::class], 'no_notes' => ['alias' => false, 'trigger_class' => NotesEmpty::class, 'needs_context' => false,],
'any_notes' => ['alias' => false, 'trigger_class' => NotesAny::class], 'any_notes' => ['alias' => false, 'trigger_class' => NotesAny::class, 'needs_context' => false,],
// exact amount // exact amount
'amount_exactly' => ['alias' => false, 'trigger_class' => AmountExactly::class], 'amount_exactly' => ['alias' => false, 'trigger_class' => AmountExactly::class, 'needs_context' => true,],
'amount_is' => ['alias' => true, 'alias_for' => 'amount_exactly'], 'amount_is' => ['alias' => true, 'alias_for' => 'amount_exactly', 'needs_context' => true,],
'amount' => ['alias' => true, 'alias_for' => 'amount_exactly'], 'amount' => ['alias' => true, 'alias_for' => 'amount_exactly', 'needs_context' => true,],
// is less than // is less than
'amount_less' => ['alias' => false, 'trigger_class' => AmountLess::class], 'amount_less' => ['alias' => false, 'trigger_class' => AmountLess::class, 'needs_context' => true,],
'amount_max' => ['alias' => true, 'alias_for' => 'amount_less'], 'amount_max' => ['alias' => true, 'alias_for' => 'amount_less', 'needs_context' => true,],
// is more than // is more than
'amount_more' => ['alias' => false, 'trigger_class' => AmountMore::class], 'amount_more' => ['alias' => false, 'trigger_class' => AmountMore::class, 'needs_context' => true,],
'amount_min' => ['alias' => true, 'alias_for' => 'amount_more'], 'amount_min' => ['alias' => true, 'alias_for' => 'amount_more', 'needs_context' => true,],
// source account // source account
'from_account_is' => ['alias' => false, 'trigger_class' => FromAccountIs::class], 'from_account_is' => ['alias' => false, 'trigger_class' => FromAccountIs::class, 'needs_context' => true,],
'source' => ['alias' => true, 'alias_for' => 'from_account_is'], 'source' => ['alias' => true, 'alias_for' => 'from_account_is', 'needs_context' => true,],
'from' => ['alias' => true, 'alias_for' => 'from_account_is'], 'from' => ['alias' => true, 'alias_for' => 'from_account_is', 'needs_context' => true,],
// destination account // destination account
'to_account_is' => ['alias' => false, 'trigger_class' => ToAccountIs::class], 'to_account_is' => ['alias' => false, 'trigger_class' => ToAccountIs::class, 'needs_context' => true,],
'destination' => ['alias' => true, 'alias_for' => 'to_account_is'], 'destination' => ['alias' => true, 'alias_for' => 'to_account_is', 'needs_context' => true,],
'to' => ['alias' => true, 'alias_for' => 'to_account_is'], 'to' => ['alias' => true, 'alias_for' => 'to_account_is', 'needs_context' => true,],
// category // category
'category_is' => ['alias' => false, 'trigger_class' => CategoryIs::class], 'category_is' => ['alias' => false, 'trigger_class' => CategoryIs::class, 'needs_context' => true,],
'category' => ['alias' => true, 'alias_for' => 'category_is'], 'category' => ['alias' => true, 'alias_for' => 'category_is', 'needs_context' => true,],
// budget // budget
'budget_is' => ['alias' => false, 'trigger_class' => BudgetIs::class], 'budget_is' => ['alias' => false, 'trigger_class' => BudgetIs::class, 'needs_context' => true,],
'budget' => ['alias' => true, 'alias_for' => 'budget_is'], 'budget' => ['alias' => true, 'alias_for' => 'budget_is', 'needs_context' => true,],
// bill // bill
'bill_is' => ['alias' => false, 'trigger_class' => BillIs::class], // TODO 'bill_is' => ['alias' => false, 'trigger_class' => BillIs::class, 'needs_context' => true,], // TODO
'bill' => ['alias' => true, 'alias_for' => 'bill_is'], 'bill' => ['alias' => true, 'alias_for' => 'bill_is', 'needs_context' => true,],
// type // type
'transaction_type' => ['alias' => false, 'trigger_class' => TransactionType::class], 'transaction_type' => ['alias' => false, 'trigger_class' => TransactionType::class, 'needs_context' => true,],
'type' => ['alias' => true, 'alias_for' => 'transaction_type'], 'type' => ['alias' => true, 'alias_for' => 'transaction_type', 'needs_context' => true,],
// date: // date:
'date_is' => ['alias' => false, 'trigger_class' => DateIs::class], 'date_is' => ['alias' => false, 'trigger_class' => DateIs::class, 'needs_context' => true,],
'date' => ['alias' => true, 'alias_for' => 'date_is'], 'date' => ['alias' => true, 'alias_for' => 'date_is', 'needs_context' => true,],
'on' => ['alias' => true, 'alias_for' => 'date_is'], 'on' => ['alias' => true, 'alias_for' => 'date_is', 'needs_context' => true,],
'date_before' => ['alias' => false, 'trigger_class' => DateBefore::class], 'date_before' => ['alias' => false, 'trigger_class' => DateBefore::class, 'needs_context' => true,],
'before' => ['alias' => true, 'alias_for' => 'date_before'], 'before' => ['alias' => true, 'alias_for' => 'date_before', 'needs_context' => true,],
'date_after' => ['alias' => false, 'trigger_class' => DateAfter::class], 'date_after' => ['alias' => false, 'trigger_class' => DateAfter::class, 'needs_context' => true,],
'after' => ['alias' => true, 'alias_for' => 'date_after'], 'after' => ['alias' => true, 'alias_for' => 'date_after', 'needs_context' => true,],
// other interesting fields // other interesting fields
'tag_is' => ['alias' => false, 'trigger_class' => TagIs::class], 'tag_is' => ['alias' => false, 'trigger_class' => TagIs::class, 'needs_context' => true,],
'tag' => ['alias' => true, 'alias_for' => 'tag'], 'tag' => ['alias' => true, 'alias_for' => 'tag', 'needs_context' => true,],
'created_on' => ['alias' => false, 'trigger_class' => CreatedOn::class], // TODO 'created_on' => ['alias' => false, 'trigger_class' => CreatedOn::class, 'needs_context' => true,], // TODO
'updated_on' => ['alias' => false, 'trigger_class' => UpdatedOn::class], // TODO 'updated_on' => ['alias' => false, 'trigger_class' => UpdatedOn::class, 'needs_context' => true,], // TODO
'external_id' => ['alias' => false, 'trigger_class' => ExternalId::class], // TODO 'external_id' => ['alias' => false, 'trigger_class' => ExternalId::class, 'needs_context' => true,], // TODO
'internal_reference' => ['alias' => false, 'trigger_class' => InternalReference::class], // TODO 'internal_reference' => ['alias' => false, 'trigger_class' => InternalReference::class, 'needs_context' => true,], // TODO
], ],
], ],