public IEnumerable <IRuleExecutionElement <TDocumentType> > ExecuteRuleQuery(string year, string returnType, string jurisdiction, string schemaType, string defaultNameSpace = "", Processor processor = null)
        {
            var key = new Tuple <string, string, string, string>(year, returnType, jurisdiction, schemaType);

            _rulesCache.CheckCacheState(key);

            if (!_rulesCache.Contains(key))
            {
                lock (_lockProvider.GetLockFor(key))
                {
                    if (!_rulesCache.Contains(key))
                    {
                        List <Guid> lst = new List <Guid>()
                        {
                            new Guid("b23384ef-83f7-4c3c-b5ad-a5fb0113e6dc")
                        };



                        var rules = _repository.GetAll <Rule>().Where(r =>
                                                                      r.IsDeleted == false &&
                                                                      r.IsActive == true &&
                                                                      r.IsPublished == true &&
                                                                      r.Logic != null &&
                                                                      r.Logic != string.Empty &&
                                                                      r.TaxAppYear.Year == year &&
                                                                      (r.ReturnType.Name == returnType || r.SecondaryReturnTypes.Any(x => x.Name == returnType)) &&
                                                                      (r.Jurisdiction.Name == jurisdiction || r.SecondaryJurisdictions.Any(x => x.Name == jurisdiction)) &&
                                                                      r.SchemaType.Name == schemaType && lst.Contains(r.Id)).ToList();
                        var ruleExecutionElements = rules.Select <Rule, IRuleExecutionElement <TDocumentType> >(rule => _ruleExecutionElementFactory.CreateRuleExecutionElement(rule, defaultNameSpace, processor)).ToList();

                        var goToLinkInfo = _repository.GetAll <GoToLink>().Where(g =>
                                                                                 g.Area != null && g.Area != string.Empty &&
                                                                                 g.Screen != null && g.Screen != string.Empty &&
                                                                                 g.Field != null && g.Field != string.Empty);

                        foreach (IRuleExecutionElement <TDocumentType> element in ruleExecutionElements)
                        {
                            var a = goToLinkInfo.FirstOrDefault(x => x.Rule.Id == element.RuleId);
                            if (a != null)
                            {
                                element.GoToArea   = a.Area;
                                element.GoToScreen = a.Screen;
                                element.GoToField  = a.Field;
                            }
                        }

                        _rulesCache.AddElement(key, ruleExecutionElements);
                        return(ruleExecutionElements);
                    }
                }
            }
            return(_rulesCache[key]);
        }