@@ -64,10 +64,10 @@ public static void Start(SchemaBuilder sb, IFileTypeAlgorithm cachedQueryAlgorit
64
64
65
65
SchedulerLogic.ExecuteTask.Register((DashboardEntity db, ScheduledTaskContext ctx) => { db.Execute(DashboardOperation.RegenerateCachedQueries); return null; });
66
66
67
-
OnGetCachedQueryDefinition.Register((UserChartPartEntity ucp, PanelPartEmbedded pp) => new[] { new CachedQueryDefinition(ucp.UserChart.ToChartRequest().ToQueryRequest(), ucp.UserChart.Filters.GetPinnedFilterTokens(), pp, ucp.UserChart, ucp.IsQueryCached, canWriteFilters: true) });
68
-
OnGetCachedQueryDefinition.Register((CombinedUserChartPartEntity cucp, PanelPartEmbedded pp) => cucp.UserCharts.Select(uc => new CachedQueryDefinition(uc.UserChart.ToChartRequest().ToQueryRequest(), uc.UserChart.Filters.GetPinnedFilterTokens(), pp, uc.UserChart, uc.IsQueryCached, canWriteFilters: false)));
69
-
OnGetCachedQueryDefinition.Register((UserQueryPartEntity uqp, PanelPartEmbedded pp) => new[] { new CachedQueryDefinition(uqp.RenderMode == UserQueryPartRenderMode.BigValue ? uqp.UserQuery.ToQueryRequestValue() : uqp.UserQuery.ToQueryRequest(), uqp.UserQuery.Filters.GetPinnedFilterTokens(), pp, uqp.UserQuery, uqp.IsQueryCached, canWriteFilters: false) });
70
-
OnGetCachedQueryDefinition.Register((ValueUserQueryListPartEntity vuql, PanelPartEmbedded pp) => vuql.UserQueries.Select(uqe => new CachedQueryDefinition(uqe.UserQuery.ToQueryRequestValue(), uqe.UserQuery.Filters.GetPinnedFilterTokens(), pp, uqe.UserQuery, uqe.IsQueryCached, canWriteFilters: false)));
67
+
OnGetCachedQueryDefinition.Register((UserChartPartEntity ucp, PanelPartEmbedded pp) => new[] { new CachedQueryDefinition(ucp.UserChart.ToChartRequest().ToQueryRequest(), ucp.UserChart.Filters.GetDashboardPinnedFilterTokens(), pp, ucp.UserChart, ucp.IsQueryCached, canWriteFilters: true) });
68
+
OnGetCachedQueryDefinition.Register((CombinedUserChartPartEntity cucp, PanelPartEmbedded pp) => cucp.UserCharts.Select(uc => new CachedQueryDefinition(uc.UserChart.ToChartRequest().ToQueryRequest(), uc.UserChart.Filters.GetDashboardPinnedFilterTokens(), pp, uc.UserChart, uc.IsQueryCached, canWriteFilters: false)));
69
+
OnGetCachedQueryDefinition.Register((UserQueryPartEntity uqp, PanelPartEmbedded pp) => new[] { new CachedQueryDefinition(uqp.RenderMode == UserQueryPartRenderMode.BigValue ? uqp.UserQuery.ToQueryRequestValue() : uqp.UserQuery.ToQueryRequest(), uqp.UserQuery.Filters.GetDashboardPinnedFilterTokens(), pp, uqp.UserQuery, uqp.IsQueryCached, canWriteFilters: false) });
70
+
OnGetCachedQueryDefinition.Register((ValueUserQueryListPartEntity vuql, PanelPartEmbedded pp) => vuql.UserQueries.Select(uqe => new CachedQueryDefinition(uqe.UserQuery.ToQueryRequestValue(), uqe.UserQuery.Filters.GetDashboardPinnedFilterTokens(), pp, uqe.UserQuery, uqe.IsQueryCached, canWriteFilters: false)));
71
71
OnGetCachedQueryDefinition.Register((UserTreePartEntity ute, PanelPartEmbedded pp) => Array.Empty<CachedQueryDefinition>());
72
72
OnGetCachedQueryDefinition.Register((LinkListPartEntity uqp, PanelPartEmbedded pp) => Array.Empty<CachedQueryDefinition>());
73
73
@@ -447,57 +447,103 @@ public static List<CachedQueryDefinition> GetCachedQueryDefinitions(DashboardEnt
447
447
if (!writers.Any())
448
448
continue;
449
449
450
-
var equivalences = db.TokenEquivalencesGroups.Where(a => a.InteractionGroup == key || a.InteractionGroup == null);
450
+
var equivalenceGroups = db.TokenEquivalencesGroups.Where(a => a.InteractionGroup == key || a.InteractionGroup == null);
451
451
452
452
foreach (var wr in writers)
453
453
{
454
-
var keyColumns = wr.QueryRequest.GroupResults ?
455
-
wr.QueryRequest.Columns.Where(c => c.Token is not AggregateToken) :
456
-
wr.QueryRequest.Columns;
457
-
458
-
var equivalencesDictionary = (from gr in equivalences
459
-
from t in gr.TokenEquivalences.Where(a => a.Query.ToQueryName() == wr.QueryRequest.QueryName)
460
-
select KeyValuePair.Create(t.Token.Token, gr.TokenEquivalences.GroupToDictionary(a => a.Query.ToQueryName(), a => a.Token.Token)))
461
-
.ToDictionaryEx();
454
+
var keyColumns = wr.QueryRequest.GroupResults ?
455
+
wr.QueryRequest.Columns.Where(c => c.Token is not AggregateToken).Select(c => c.Token).Distinct().ToList() :
456
+
wr.QueryRequest.Columns.Select(c => c.Token).Distinct().ToList();
457
+
458
+
Dictionary<QueryToken, Dictionary<object, List<QueryToken>>> equivalencesDictionary = GetEquivalenceDictionary(equivalenceGroups, fromQuery: wr.QueryRequest.QueryName);
462
459
463
460
foreach (var cqd in cqdefs.Where(e => e != wr))
464
461
{
465
-
var extraColumns = keyColumns.Select(k =>
466
-
{
467
-
var translatedToken = TranslatedToken(k.Token, cqd.QueryRequest.QueryName, equivalencesDictionary);
468
-
469
-
if (translatedToken == null)
470
-
return null;
471
-
472
-
if (!cqd.QueryRequest.Columns.Any(c => translatedToken.Contains(c.Token)))
473
-
return translatedToken.FirstEx(); //Doesn't really matter if we add "Product" or "Entity.Product";
474
-
475
-
return null;
476
-
}).NotNull().ToList();
462
+
List<QueryToken> extraColumns = ExtraColumns(keyColumns, cqd, equivalencesDictionary);
477
463
478
464
if (extraColumns.Any())
479
465
{
480
-
ExpandColumns(cqd, extraColumns);
466
+
ExpandColumns(cqd, extraColumns, "Dashboard Filters from " + key);
481
467
}
482
468
483
469
cqd.QueryRequest.Pagination = new Pagination.All();
484
470
}
485
471
}
486
472
}
487
473
488
-
foreach (var cqd in definitions)
474
+
foreach (var writer in definitions)
489
475
{
490
-
if (cqd.PinnedFiltersTokens.Any())
491
-
ExpandColumns(cqd, cqd.PinnedFiltersTokens);
476
+
if (writer.PinnedFiltersTokens.Any())
477
+
{
478
+
var pft = writer.PinnedFiltersTokens.Where(a => a.prototedToDashboard == false).Select(a=>a.token).ToList();
479
+
if (pft.Any())
480
+
ExpandColumns(writer, pft, "Pinned Filters");
481
+
482
+
var dpft = writer.PinnedFiltersTokens.Where(a => a.prototedToDashboard == true).Select(a => a.token).ToList();
483
+
if (dpft.Any())
484
+
{
485
+
var equivalenceGroups = db.TokenEquivalencesGroups.Where(a => /*a.InteractionGroup == writer.PanelPart.InteractionGroup Needed? ||*/ a.InteractionGroup == null);
486
+
487
+
Dictionary<QueryToken, Dictionary<object, List<QueryToken>>> equivalencesDictionary = GetEquivalenceDictionary(equivalenceGroups, fromQuery: writer.QueryRequest.QueryName);
488
+
489
+
foreach (var cqd in definitions.Where(e => e != writer))
490
+
{
491
+
List<QueryToken> extraColumns = ExtraColumns(dpft, cqd, equivalencesDictionary);
492
+
if (extraColumns.Any())
493
+
{
494
+
ExpandColumns(cqd, extraColumns, "Dashboard Pinned Filters");
495
+
}
496
+
}
497
+
}
498
+
499
+
}
492
500
}
493
501
494
502
var cached = definitions.Where(a => a.IsQueryCached).ToList();
495
503
496
504
return cached;
497
505
}
498
506
499
-
private static void ExpandColumns(CachedQueryDefinition cqd, List<QueryToken> extraColumns)
507
+
private static List<QueryToken> ExtraColumns(List<QueryToken> requiredTokens, CachedQueryDefinition cqd, Dictionary<QueryToken, Dictionary<object, List<QueryToken>>> equivalencesDictionary)
508
+
{
509
+
var extraColumns = requiredTokens.Select(t =>
510
+
{
511
+
var translatedToken = TranslatedToken(t, cqd.QueryRequest.QueryName, equivalencesDictionary);
512
+
513
+
if (translatedToken == null)
514
+
return null;
515
+
516
+
if (!cqd.QueryRequest.Columns.Any(c => translatedToken.Contains(c.Token)))
517
+
return translatedToken.FirstEx(); //Doesn't really matter if we add "Product" or "Entity.Product";
518
+
519
+
return null;
520
+
}).NotNull().ToList();
521
+
return extraColumns;
522
+
}
523
+
524
+
private static Dictionary<QueryToken, Dictionary<object, List<QueryToken>>> GetEquivalenceDictionary(IEnumerable<TokenEquivalenceGroupEntity> equivalences, object fromQuery)
525
+
{
526
+
return (from gr in equivalences
527
+
from t in gr.TokenEquivalences.Where(a => a.Query.ToQueryName() == fromQuery)
528
+
select KeyValuePair.Create(t.Token.Token, gr.TokenEquivalences.GroupToDictionary(a => a.Query.ToQueryName(), a => a.Token.Token)))
529
+
.ToDictionaryEx();
530
+
}
531
+
532
+
private static void ExpandColumns(CachedQueryDefinition cqd, List<QueryToken> extraColumns, string errorContext)
500
533
{
534
+
if (cqd.QueryRequest.GroupResults)
535
+
{
536
+
var errors = extraColumns
537
+
.Select(a => new {
538
+
token = a,
539
+
error = QueryUtils.CanColumn(a) ?? (cqd.QueryRequest.GroupResults && !a.IsGroupable ? "Is not groupable" : null)
540
+
})
541
+
.Where(a => a.error != null);
542
+
543
+
if (errors.Any())
544
+
throw new InvalidOperationException($"Unable to expand columns in '{cqd.UserAsset.KeyLong()}' (query {QueryUtils.GetKey(cqd.QueryRequest.QueryName)}) requested by {errorContext} because: \r\n{errors.ToString(a => a.token.FullKey() + ": " + a.error, "\r\n")}");
545
+
}
546
+
501
547
cqd.QueryRequest.Columns.AddRange(extraColumns.Select(c => new Column(c, null)));
502
548
var avgs = cqd.QueryRequest.Columns.Extract(a => a.Token is AggregateToken at && at.AggregateFunction == AggregateFunction.Average);
503
549
foreach (var av in avgs)
@@ -578,7 +624,7 @@ public static List<CombinedCachedQueryDefinition> CombineCachedQueryDefinitions(
578
624
579
625
public class CachedQueryDefinition
580
626
{
581
-
public CachedQueryDefinition(QueryRequest queryRequest, List<QueryToken> pinnedFiltersTokens, PanelPartEmbedded panelPart, IUserAssetEntity userAsset, bool isQueryCached, bool canWriteFilters)
627
+
public CachedQueryDefinition(QueryRequest queryRequest, List<(QueryToken token, bool prototedToDashboard)> pinnedFiltersTokens, PanelPartEmbedded panelPart, IUserAssetEntity userAsset, bool isQueryCached, bool canWriteFilters)
582
628
{
583
629
QueryRequest = queryRequest;
584
630
PinnedFiltersTokens = pinnedFiltersTokens;
@@ -590,7 +636,7 @@ public CachedQueryDefinition(QueryRequest queryRequest, List<QueryToken> pinnedF
590
636
}
591
637
592
638
public QueryRequest QueryRequest { get; set; }
593
-
public List<QueryToken> PinnedFiltersTokens { get; set; }
639
+
public List<(QueryToken token, bool prototedToDashboard)> PinnedFiltersTokens { get; set; }
594
640
public PanelPartEmbedded PanelPart { get; set; }
595
641
public Guid Guid { get; set; }
596
642
public Lite<IUserAssetEntity> UserAsset { get; set; }
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4