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)); } }
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); }