Example #1
0
        private static FragmentQuery GenerateFragmentQuery(IEnumerable <CellTreeNode> children, bool isLeft, ViewgenContext context, CellTreeOpType OpType)
        {
            Debug.Assert(children.Any());
            FragmentQuery fragmentQuery = isLeft ? children.First().LeftFragmentQuery : children.First().RightFragmentQuery;

            FragmentQueryProcessor qp = isLeft ? context.LeftFragmentQP : context.RightFragmentQP;

            foreach (var child in children.Skip(1))
            {
                FragmentQuery nextQuery = isLeft ? child.LeftFragmentQuery : child.RightFragmentQuery;
                switch (OpType)
                {
                case CellTreeOpType.IJ:
                    fragmentQuery = qp.Intersect(fragmentQuery, nextQuery);
                    break;

                case CellTreeOpType.LOJ:
                    // Left outer join means keeping the domain of the leftmost child
                    break;

                case CellTreeOpType.LASJ:
                    // not used in basic view generation but current validation calls Simplify, so add this for debugging
                    fragmentQuery = qp.Difference(fragmentQuery, nextQuery);
                    break;

                default:
                    // All other operators (Union, FOJ) require union of the domains
                    fragmentQuery = qp.Union(fragmentQuery, nextQuery);
                    break;
                }
            }
            return(fragmentQuery);
        }
        private static FragmentQuery GenerateFragmentQuery(
            IEnumerable <CellTreeNode> children,
            bool isLeft,
            ViewgenContext context,
            CellTreeOpType OpType)
        {
            FragmentQuery          fragmentQuery1         = isLeft ? children.First <CellTreeNode>().LeftFragmentQuery : children.First <CellTreeNode>().RightFragmentQuery;
            FragmentQueryProcessor fragmentQueryProcessor = isLeft ? context.LeftFragmentQP : context.RightFragmentQP;

            foreach (CellTreeNode cellTreeNode in children.Skip <CellTreeNode>(1))
            {
                FragmentQuery fragmentQuery2 = isLeft ? cellTreeNode.LeftFragmentQuery : cellTreeNode.RightFragmentQuery;
                switch (OpType)
                {
                case CellTreeOpType.LOJ:
                    continue;

                case CellTreeOpType.IJ:
                    fragmentQuery1 = fragmentQueryProcessor.Intersect(fragmentQuery1, fragmentQuery2);
                    continue;

                case CellTreeOpType.LASJ:
                    fragmentQuery1 = fragmentQueryProcessor.Difference(fragmentQuery1, fragmentQuery2);
                    continue;

                default:
                    fragmentQuery1 = fragmentQueryProcessor.Union(fragmentQuery1, fragmentQuery2);
                    continue;
                }
            }
            return(fragmentQuery1);
        }