Esempio n. 1
0
        Chainer ISemantic.Translate(SemqContext context, DbNode predecessor)
        {
            if (context == null)
            {
                throw new QueryTalkException(this, QueryTalkExceptionType.NullArgumentInnerException,
                                             "context = null", "InternalNode.ISemantic.Translate");
            }

            if (predecessor == null)
            {
                throw new QueryTalkException(this, QueryTalkExceptionType.NullArgumentInnerException,
                                             "predecessor = null", "InternalNode.ISemantic.Translate");
            }

            context.SetIndex(this);

            var from = GetDesigner().From(new Table(Map.Name, new AliasAs(Index)));

            if (!((IPredicate)this).HasPredicate)
            {
                return(from);
            }

            var predicate          = ((IPredicate)this).Predicates[0];
            var relation           = DbMapping.GetRelation(predecessor.SynonymOrThis.NodeID, NodeID, DB3.Default);
            var relationExpression = relation.BuildRelation(predecessor.SynonymOrThis.NodeID, predecessor.Index, Index).E();

            if (predicate.PredicateType == PredicateType.Cartesian)
            {
                var innerNode = ((ISemantic)predicate).Subject;
                context.SetIndex(innerNode);
                innerNode.QueryRoot = context.Subject;

                var innerJoinAs = from
                                  .InnerJoin((IOpenView)innerNode)
                                  .As(innerNode.Index);

                var joinRelation   = DbMapping.GetRelation(NodeID, innerNode.SynonymOrThis.NodeID, DB3.Default);
                var joinExpression = joinRelation.BuildRelation(NodeID, Index, innerNode.Index).E();
                var on             = innerJoinAs
                                     .On(joinExpression);

                if (IsFinalizeable)
                {
                    return(on.Where(relationExpression));
                }
                else
                {
                    return(on);
                }
            }
            else
            {
                return((Chainer)from.WhereExists(
                           (INonSelectView)
                           ((ISemantic)predicate).Translate(context, this), true)
                       .AndWhere(relationExpression, true));
            }
        }
Esempio n. 2
0
        private static void ProcessMaximized(SemqContext context, Predicate predicate, ref Chainer query)
        {
            var ix1 = context.GetNewIndex();
            var ix2 = context.GetNewIndex();

            var self = predicate.Subject;

            context.SetIndex(self);

            var maximizedExpression = predicate.MaximizedExpression;

            var ordered = predicate.MaximizedType == MaximizationType.Min ?
                          new OrderedChainer(maximizedExpression, SortOrder.Asc) :
                          new OrderedChainer(maximizedExpression, SortOrder.Desc);

            var root = new InternalNode(self);

            query = root.GetDesigner()
                    .From(Designer.GetNewDesigner()
                          .From(((ISelect)query).Select(), root).As(ix1)
                          .OrderBy(ordered)
                          .Select().TopWithTies(predicate.MaximizedTop)
                          , root
                          ).As(ix2);

            self.ChangeIndex(ix2);
        }