private void AddElseDefaultToCaseStatement(
            MemberPath currentPath,
            CaseStatement caseStatement,
            List <Constant> domain,
            CellTreeNode rightDomainQuery,
            Tile <FragmentQuery> unionCaseRewriting)
        {
            Constant defaultConstant;
            bool     valueForMemberPath = Domain.TryGetDefaultValueForMemberPath(currentPath, out defaultConstant);

            if (valueForMemberPath && domain.Contains(defaultConstant))
            {
                return;
            }
            CellTreeNode  cellTree = QueryRewriter.TileToCellTree(unionCaseRewriting, this._context);
            FragmentQuery query    = this._context.RightFragmentQP.Difference(rightDomainQuery.RightFragmentQuery, cellTree.RightFragmentQuery);

            if (!this._context.RightFragmentQP.IsSatisfiable(query))
            {
                return;
            }
            if (valueForMemberPath)
            {
                caseStatement.AddWhenThen(BoolExpression.True, (ProjectedSlot) new ConstantProjectedSlot(defaultConstant));
            }
            else
            {
                query.Condition.ExpensiveSimplify();
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.AppendLine(Strings.ViewGen_No_Default_Value_For_Configuration((object)currentPath.PathToString(new bool?(false))));
                this._errorLog.AddEntry(new ErrorLog.Record(ViewGenErrorCode.NoDefaultValue, stringBuilder.ToString(), (IEnumerable <LeftCellWrapper>) this._context.AllWrappersForExtent, string.Empty));
            }
        }
 internal void AddTrivialCaseStatementsForConditionMembers()
 {
     for (int index = 0; index < this._context.MemberMaps.ProjectedSlotMap.Count; ++index)
     {
         MemberPath projectedSlot = this._context.MemberMaps.ProjectedSlotMap[index];
         if (!projectedSlot.IsScalarType() && !this._caseStatements.ContainsKey(projectedSlot))
         {
             Constant      constant      = (Constant) new TypeConstant(projectedSlot.EdmType);
             CaseStatement caseStatement = new CaseStatement(projectedSlot);
             caseStatement.AddWhenThen(BoolExpression.True, (ProjectedSlot) new ConstantProjectedSlot(constant));
             this._caseStatements[projectedSlot] = caseStatement;
         }
     }
 }
        private bool AddRewritingToCaseStatement(
            Tile <FragmentQuery> rewriting,
            CaseStatement caseStatement,
            MemberPath currentPath,
            Constant domainValue)
        {
            BoolExpression boolExpression = BoolExpression.True;
            bool           flag           = this._qp.IsContainedIn((Tile <FragmentQuery>)QueryRewriter.CreateTile(this._domainQuery), rewriting);

            if (this._qp.IsDisjointFrom((Tile <FragmentQuery>)QueryRewriter.CreateTile(this._domainQuery), rewriting))
            {
                return(false);
            }
            int            num           = flag ? 1 : 0;
            ProjectedSlot  projectedSlot = !domainValue.HasNotNull() ? (ProjectedSlot) new ConstantProjectedSlot(domainValue) : (ProjectedSlot) new MemberProjectedSlot(currentPath);
            BoolExpression condition     = flag ? BoolExpression.True : QueryRewriter.TileToBoolExpr(rewriting);

            caseStatement.AddWhenThen(condition, projectedSlot);
            return(flag);
        }
        private List <LeftCellWrapper> RemapFromVariables()
        {
            List <LeftCellWrapper> leftCellWrapperList = new List <LeftCellWrapper>();
            int index = 0;
            Dictionary <BoolLiteral, BoolLiteral> remap = new Dictionary <BoolLiteral, BoolLiteral>(BoolLiteral.EqualityIdentifierComparer);

            foreach (LeftCellWrapper leftCellWrapper in this._context.AllWrappersForExtent)
            {
                if (this._usedViews.Contains(leftCellWrapper.FragmentQuery))
                {
                    leftCellWrapperList.Add(leftCellWrapper);
                    int cellNumber = leftCellWrapper.OnlyInputCell.CellNumber;
                    if (index != cellNumber)
                    {
                        remap[(BoolLiteral) new CellIdBoolean(this._identifiers, cellNumber)] = (BoolLiteral) new CellIdBoolean(this._identifiers, index);
                    }
                    ++index;
                }
            }
            if (remap.Count > 0)
            {
                this._topLevelWhereClause = this._topLevelWhereClause.RemapLiterals(remap);
                Dictionary <MemberPath, CaseStatement> dictionary = new Dictionary <MemberPath, CaseStatement>();
                foreach (KeyValuePair <MemberPath, CaseStatement> caseStatement1 in this._caseStatements)
                {
                    CaseStatement caseStatement2 = new CaseStatement(caseStatement1.Key);
                    foreach (CaseStatement.WhenThen clause in caseStatement1.Value.Clauses)
                    {
                        caseStatement2.AddWhenThen(clause.Condition.RemapLiterals(remap), clause.Value);
                    }
                    dictionary[caseStatement1.Key] = caseStatement2;
                }
                this._caseStatements = dictionary;
            }
            return(leftCellWrapperList);
        }
        private void GenerateCaseStatements(
            IEnumerable <MemberPath> members,
            HashSet <FragmentQuery> outputUsedViews)
        {
            CellTreeNode rightDomainQuery = (CellTreeNode) new OpCellTreeNode(this._context, CellTreeOpType.Union, (CellTreeNode[])this._context.AllWrappersForExtent.Where <LeftCellWrapper>((Func <LeftCellWrapper, bool>)(w => this._usedViews.Contains(w.FragmentQuery))).Select <LeftCellWrapper, LeafCellTreeNode>((Func <LeftCellWrapper, LeafCellTreeNode>)(wrapper => new LeafCellTreeNode(this._context, wrapper))).ToArray <LeafCellTreeNode>());

            foreach (MemberPath member in members)
            {
                List <Constant>      list          = this.GetDomain(member).ToList <Constant>();
                CaseStatement        caseStatement = new CaseStatement(member);
                Tile <FragmentQuery> tile          = (Tile <FragmentQuery>)null;
                bool flag = list.Count != 2 || !list.Contains <Constant>(Constant.Null, Constant.EqualityComparer) || !list.Contains <Constant>(Constant.NotNull, Constant.EqualityComparer);
                foreach (Constant domainValue in list)
                {
                    if (domainValue == Constant.Undefined && this._context.ViewTarget == ViewTarget.QueryView)
                    {
                        caseStatement.AddWhenThen(BoolExpression.False, (ProjectedSlot) new ConstantProjectedSlot(Constant.Undefined));
                    }
                    else
                    {
                        FragmentQuery        memberConditionQuery = this.CreateMemberConditionQuery(member, domainValue);
                        Tile <FragmentQuery> rewriting;
                        if (this.FindRewritingAndUsedViews((IEnumerable <MemberPath>)memberConditionQuery.Attributes, memberConditionQuery.Condition, outputUsedViews, out rewriting))
                        {
                            if (this._context.ViewTarget == ViewTarget.UpdateView)
                            {
                                tile = tile != null?this._qp.Union(tile, rewriting) : rewriting;
                            }
                            if (flag)
                            {
                                if (this.AddRewritingToCaseStatement(rewriting, caseStatement, member, domainValue))
                                {
                                    break;
                                }
                            }
                        }
                        else if (!QueryRewriter.IsDefaultValue(domainValue, member) && !ErrorPatternMatcher.FindMappingErrors(this._context, this._domainMap, this._errorLog))
                        {
                            StringBuilder builder = new StringBuilder();
                            string        str1    = StringUtil.FormatInvariant("{0}", (object)this._extentPath);
                            string        str2    = this._context.ViewTarget == ViewTarget.QueryView ? Strings.ViewGen_Entities : Strings.ViewGen_Tuples;
                            if (this._context.ViewTarget == ViewTarget.QueryView)
                            {
                                builder.AppendLine(Strings.Viewgen_CannotGenerateQueryViewUnderNoValidation((object)str1));
                            }
                            else
                            {
                                builder.AppendLine(Strings.ViewGen_Cannot_Disambiguate_MultiConstant((object)str2, (object)str1));
                            }
                            RewritingValidator.EntityConfigurationToUserString(memberConditionQuery.Condition, builder, this._context.ViewTarget == ViewTarget.UpdateView);
                            this._errorLog.AddEntry(new ErrorLog.Record(ViewGenErrorCode.AmbiguousMultiConstants, builder.ToString(), (IEnumerable <LeftCellWrapper>) this._context.AllWrappersForExtent, string.Empty));
                        }
                    }
                }
                if (this._errorLog.Count == 0)
                {
                    if (this._context.ViewTarget == ViewTarget.UpdateView && flag)
                    {
                        this.AddElseDefaultToCaseStatement(member, caseStatement, list, rightDomainQuery, tile);
                    }
                    if (caseStatement.Clauses.Count > 0)
                    {
                        this._caseStatements[member] = caseStatement;
                    }
                }
            }
        }