--
-- workflow_case__evaluate_guard/7
--
create or replace function workflow_case__evaluate_guard(
  character varying,
  character varying,
  integer,
  character varying,
  character varying,
  character varying,
  character varying
) returns bool as $$

declare
  evaluate_guard__callback               alias for $1;  
  evaluate_guard__custom_arg             alias for $2;  
  evaluate_guard__case_id                alias for $3;  
  evaluate_guard__workflow_key           alias for $4;  
  evaluate_guard__transition_key         alias for $5;  
  evaluate_guard__place_key              alias for $6;  
  evaluate_guard__direction              alias for $7;  
  v_guard_happy_p                        boolean;
  v_rec                                  record;
  v_str                                  text default '';
begin
        if evaluate_guard__callback = '' or 
           evaluate_guard__callback is null then
            -- null guard evaluates to true
            return 't';
        else
            if evaluate_guard__callback = '#' then
                return 'f';
            else
                v_str := 'select ' || evaluate_guard__callback
                || '(' || 
                evaluate_guard__case_id || ',' || 
                quote_literal(evaluate_guard__workflow_key) || ',' || 
                quote_literal(evaluate_guard__transition_key) || ',' || 
                quote_literal(evaluate_guard__place_key) || ',' || 
                quote_literal(evaluate_guard__direction) || ',' || 
                coalesce(quote_literal(evaluate_guard__custom_arg),'null') || ') as guard_happy_p';
                raise notice 'str = %', v_str;
                for v_rec in 
                    execute v_str
                LOOP
                    return v_rec.guard_happy_p;                        
                end LOOP;
            end if;
        end if;

        return null;
     
end;$$ language plpgsql;