New features for rules in search.

This commit is contained in:
James Cole
2020-08-27 07:12:44 +02:00
parent 7df084dd3c
commit 4c81a46af6
9 changed files with 132 additions and 64 deletions

View File

@@ -92,14 +92,7 @@ class IndexController extends Controller
public function search(Rule $rule): RedirectResponse
{
$route = route('search.index');
$params = [];
/** @var RuleTrigger $trigger */
foreach ($rule->ruleTriggers as $trigger) {
if ('user_action' !== $trigger->trigger_type) {
$params[] = sprintf('%s:"%s"', OperatorQuerySearch::getRootOperator($trigger->trigger_type), $trigger->trigger_value);
}
}
$query = implode(' ', $params);
$query = $this->ruleRepos->getSearchQuery($rule);
$route = sprintf('%s?%s', $route, http_build_query(['search' => $query, 'rule' => $rule->id]));
return redirect($route);

View File

@@ -189,4 +189,51 @@ class SelectController extends Controller
return response()->json(['html' => $view, 'warning' => $warning]);
}
/**
* This method allows the user to test a certain set of rule triggers. The rule triggers are grabbed from
* the rule itself.
*
* @param Rule $rule
*
* @return JsonResponse
*
*/
public function testTriggersByRule(Rule $rule): JsonResponse
{
$triggers = $rule->ruleTriggers;
if (0 === count($triggers)) {
return response()->json(['html' => '', 'warning' => (string) trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore
}
// create new rule engine:
$newRuleEngine = app(RuleEngineInterface::class);
// set rules:
$newRuleEngine->setRules(new Collection([$rule]));
$collection = $newRuleEngine->find();
$collection = $collection->slice(0, 20);
$warning = '';
if (0 === count($collection)) {
$warning = (string) trans('firefly.warning_no_matching_transactions'); // @codeCoverageIgnore
}
// Return json response
$view = 'ERROR, see logs.';
try {
$view = view('list.journals-array-tiny', ['groups' => $collection])->render();
// @codeCoverageIgnoreStart
} catch (Throwable $exception) {
Log::error(sprintf('Could not render view in testTriggersByRule(): %s', $exception->getMessage()));
Log::error($exception->getTraceAsString());
}
// @codeCoverageIgnoreEnd
return response()->json(['html' => $view, 'warning' => $warning]);
}
}

View File

@@ -22,6 +22,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Support\Search\SearchInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse;
@@ -62,15 +63,33 @@ class SearchController extends Controller
*/
public function index(Request $request, SearchInterface $searcher)
{
$fullQuery = (string) $request->get('search');
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
// search params:
$fullQuery = (string) $request->get('search');
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$ruleId = (int) $request->get('rule');
$rule = null;
$ruleChanged = false;
// find rule, check if query is different, offer to update.
$ruleRepository = app(RuleRepositoryInterface::class);
$rule = $ruleRepository->find($ruleId);
if (null !== $rule) {
$originalQuery = $ruleRepository->getSearchQuery($rule);
if ($originalQuery !== $fullQuery) {
$ruleChanged = true;
}
}
// parse search terms:
$searcher->parseQuery($fullQuery);
$query = $searcher->getWordsAsString();
$modifiers = $searcher->getModifiers();
$subTitle = (string) trans('breadcrumbs.search_result', ['query' => $query]);
return view('search.index', compact('query', 'modifiers', 'page', 'fullQuery', 'subTitle'));
// words from query and operators:
$query = $searcher->getWordsAsString();
$operators = $searcher->getOperators();
$subTitle = (string) trans('breadcrumbs.search_result', ['query' => $fullQuery]);
return view('search.index', compact('query', 'operators', 'page', 'rule', 'fullQuery', 'subTitle', 'ruleId', 'ruleChanged'));
}
/**

View File

@@ -27,6 +27,7 @@ use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleAction;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\RuleTrigger;
use FireflyIII\Support\Search\OperatorQuerySearch;
use FireflyIII\User;
use Illuminate\Support\Collection;
use Log;
@@ -119,7 +120,7 @@ class RuleRepository implements RuleRepositoryInterface
*/
public function getHighestOrderInRuleGroup(RuleGroup $ruleGroup): int
{
return (int)$ruleGroup->rules()->max('order');
return (int) $ruleGroup->rules()->max('order');
}
/**
@@ -461,8 +462,8 @@ class RuleRepository implements RuleRepositoryInterface
*/
public function duplicate(Rule $rule): Rule
{
$newRule = $rule->replicate();
$newRule->title = (string)trans('firefly.rule_copy_of', ['title' => $rule->title]);
$newRule = $rule->replicate();
$newRule->title = (string) trans('firefly.rule_copy_of', ['title' => $rule->title]);
$newRule->save();
// replicate all triggers
@@ -503,13 +504,13 @@ class RuleRepository implements RuleRepositoryInterface
*/
public function getStoreRules(): Collection
{
$collection = $this->user->rules()->with(['ruleGroup','ruleTriggers'])->get();
$filtered = new Collection;
$collection = $this->user->rules()->with(['ruleGroup', 'ruleTriggers'])->get();
$filtered = new Collection;
/** @var Rule $rule */
foreach($collection as $rule) {
foreach ($collection as $rule) {
/** @var RuleTrigger $ruleTrigger */
foreach($rule->ruleTriggers as $ruleTrigger) {
if('user_action' === $ruleTrigger->trigger_type && 'store-journal' === $ruleTrigger->trigger_value) {
foreach ($rule->ruleTriggers as $ruleTrigger) {
if ('user_action' === $ruleTrigger->trigger_type && 'store-journal' === $ruleTrigger->trigger_value) {
$filtered->push($rule);
}
}
@@ -522,17 +523,33 @@ class RuleRepository implements RuleRepositoryInterface
*/
public function getUpdateRules(): Collection
{
$collection = $this->user->rules()->with(['ruleGroup','ruleTriggers'])->get();
$filtered = new Collection;
$collection = $this->user->rules()->with(['ruleGroup', 'ruleTriggers'])->get();
$filtered = new Collection;
/** @var Rule $rule */
foreach($collection as $rule) {
foreach ($collection as $rule) {
/** @var RuleTrigger $ruleTrigger */
foreach($rule->ruleTriggers as $ruleTrigger) {
if('user_action' === $ruleTrigger->trigger_type && 'update-journal' === $ruleTrigger->trigger_value) {
foreach ($rule->ruleTriggers as $ruleTrigger) {
if ('user_action' === $ruleTrigger->trigger_type && 'update-journal' === $ruleTrigger->trigger_value) {
$filtered->push($rule);
}
}
}
return $filtered;
}
/**
* @inheritDoc
*/
public function getSearchQuery(Rule $rule): string
{
$params = [];
/** @var RuleTrigger $trigger */
foreach ($rule->ruleTriggers as $trigger) {
if ('user_action' !== $trigger->trigger_type) {
$params[] = sprintf('%s:"%s"', OperatorQuerySearch::getRootOperator($trigger->trigger_type), $trigger->trigger_value);
}
}
return implode(' ', $params);
}
}

View File

@@ -39,6 +39,14 @@ interface RuleRepositoryInterface
*/
public function count(): int;
/**
* Return search query for rule.
*
* @param Rule $rule
* @return string
*/
public function getSearchQuery(Rule $rule): string;
/**
* @param Rule $rule
* @param RuleGroup $ruleGroup