use not exists to get expired decisions

This commit is contained in:
Sebastien Blot 2022-07-21 17:20:37 +02:00
parent 496dacb7ff
commit aabd258f2b
No known key found for this signature in database
GPG key ID: DFC2902F40449F6A

View file

@ -201,28 +201,24 @@ func (c *Client) QueryExpiredDecisionsWithFilters(filters map[string][]string) (
query := c.Ent.Decision.Query().Where(
decision.UntilLT(time.Now().UTC()),
)
query, predicates, err := BuildDecisionRequestWithFilter(query, filters)
query, _, err := BuildDecisionRequestWithFilter(query, filters)
if err != nil {
c.Log.Warningf("QueryExpiredDecisionsWithFilters : %s", err)
return []*ent.Decision{}, errors.Wrap(QueryFail, "get expired decisions with filters")
}
query = query.Where(func(s *sql.Selector) {
t := sql.Table(decision.Table).As("t1")
subQuery := sql.Select(t.C(decision.FieldValue)).From(t).Where(sql.GT(t.C(decision.FieldUntil), now))
for _, predicate := range predicates {
subQuery.Where(predicate)
}
subQuery.Where(sql.And(
sql.ColumnsEQ(t.C(decision.FieldType), s.C(decision.FieldType)),
sql.ColumnsEQ(t.C(decision.FieldScope), s.C(decision.FieldScope)),
))
s.Where(
sql.NotIn(
s.C(decision.FieldValue),
subQuery,
subquery := sql.Select().From(t).Where(
sql.And(
sql.EQ(s.C(decision.FieldScope), t.C(decision.FieldScope)),
sql.EQ(s.C(decision.FieldType), t.C(decision.FieldType)),
sql.EQ(s.C(decision.FieldValue), t.C(decision.FieldValue)),
sql.GT(s.C(decision.FieldUntil), now),
),
)
s.Where(sql.NotExists(subquery))
})
data, err := query.Order(ent.Asc(decision.FieldValue), ent.Desc(decision.FieldUntil)).All(c.CTX)
@ -250,6 +246,20 @@ func (c *Client) QueryExpiredDecisionsSinceWithFilters(since time.Time, filters
return []*ent.Decision{}, errors.Wrap(QueryFail, "expired decisions with filters")
}
query = query.Where(func(s *sql.Selector) {
t := sql.Table(decision.Table).As("t1")
subquery := sql.Select().From(t).Where(
sql.And(
sql.EQ(s.C(decision.FieldScope), t.C(decision.FieldScope)),
sql.EQ(s.C(decision.FieldType), t.C(decision.FieldType)),
sql.EQ(s.C(decision.FieldValue), t.C(decision.FieldValue)),
sql.GT(s.C(decision.FieldUntil), now),
),
)
s.Where(sql.NotExists(subquery))
})
data, err := query.Order(ent.Asc(decision.FieldValue), ent.Asc(decision.FieldUntil)).All(c.CTX)
if err != nil {
c.Log.Warningf("QueryExpiredDecisionsSinceWithFilters : %s", err)