Some rules need it and it was nil until now.
struct kr_rplan {
kr_qarray_t pending;
kr_qarray_t resolved;
+ struct kr_query *initial;
struct kr_request *request;
knot_mm_t *pool;
uint32_t next_uid;
if req.current_query == nil then return nil end
return req.current_query
end,
+ -- returns the initial query that started the request
+ initial = function(req)
+ assert(ffi.istype(kr_request_t, req))
+ local rplan = C.kr_resolve_plan(req)
+ if rplan.initial == nil then return nil end
+ return rplan.initial
+ end,
-- Return last query on the resolution plan
last = function(req)
assert(ffi.istype(kr_request_t, req))
}
}
+ assert((rplan->pending.len == 0 && rplan->resolved.len == 0)
+ == (rplan->initial == NULL));
+ if (rplan->initial == NULL) {
+ rplan->initial = qry;
+ }
+
array_push(rplan->pending, qry);
return qry;
as the last is the next one to solve,
and they may be inter-dependent. */
kr_qarray_t resolved; /**< List of resolved queries. */
+ struct kr_query *initial; /**< The initial query (also in pending or resolved). */
+
struct kr_request *request; /**< Parent resolution request. */
knot_mm_t *pool; /**< Temporary memory pool. */
uint32_t next_uid; /**< Next value for kr_query::uid (incremental). */
begin = function(state, req)
-- Don't act on "finished" cases.
if bit.band(state, bit.bor(kres.FAIL, kres.DONE)) ~= 0 then return state end
- local qry = req:current()
+ local qry = req:initial() -- same as :current() but more descriptive
return policy.evaluate(policy.rules, req, qry, state)
or (special_names_optim(req, qry.sname)
and policy.evaluate(policy.special_names, req, qry, state))
if #policy.postrules == 0 then return state end
-- Don't act on failed cases.
if bit.band(state, kres.FAIL) ~= 0 then return state end
- return policy.evaluate(policy.postrules, req, req:current(), state) or state
+ return policy.evaluate(policy.postrules, req, req:initial(), state) or state
end
}