本文整理汇总了C#中System.Data.Entity.Core.Query.InternalTrees.RuleProcessingContext类的典型用法代码示例。如果您正苦于以下问题:C# RuleProcessingContext类的具体用法?C# RuleProcessingContext怎么用?C# RuleProcessingContext使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
RuleProcessingContext类属于System.Data.Entity.Core.Query.InternalTrees命名空间,在下文中一共展示了RuleProcessingContext类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C#代码示例。
示例1: ProcessSingleRowOpOverAnything
// <summary>
// Convert a
// SingleRowOp(X) => X
// if X produces at most one row
// </summary>
// <param name="context"> Rule Processing context </param>
// <param name="singleRowNode"> Current subtree </param>
// <param name="newNode"> transformed subtree </param>
// <returns> Transformation status </returns>
private static bool ProcessSingleRowOpOverAnything(RuleProcessingContext context, Node singleRowNode, out Node newNode)
{
newNode = singleRowNode;
var trc = (TransformationRulesContext)context;
var childNodeInfo = context.Command.GetExtendedNodeInfo(singleRowNode.Child0);
// If the input to this Op can produce at most one row, then we don't need the
// singleRowOp - simply return the input
if (childNodeInfo.MaxRows
<= RowCount.One)
{
newNode = singleRowNode.Child0;
return true;
}
//
// if the current node is a FilterOp, then try and determine if the FilterOp
// produces one row at most
//
if (singleRowNode.Child0.Op.OpType
== OpType.Filter)
{
var predicate = new Predicate(context.Command, singleRowNode.Child0.Child1);
if (predicate.SatisfiesKey(childNodeInfo.Keys.KeyVars, childNodeInfo.Definitions))
{
childNodeInfo.MaxRows = RowCount.One;
newNode = singleRowNode.Child0;
return true;
}
}
// we couldn't do anything
return false;
}
开发者ID:Cireson,项目名称:EntityFramework6,代码行数:43,代码来源:SingleRowOpRules.cs
示例2: ApplyRulesToNode
private static bool ApplyRulesToNode(
RuleProcessingContext context, ReadOnlyCollection<ReadOnlyCollection<Rule>> rules, Node currentNode, out Node newNode)
{
newNode = currentNode;
// Apply any pre-rule delegates
context.PreProcess(currentNode);
foreach (var r in rules[(int)currentNode.Op.OpType])
{
if (!r.Match(currentNode))
{
continue;
}
// Did the rule modify the subtree?
if (r.Apply(context, currentNode, out newNode))
{
// The node has changed; don't try to apply any more rules
context.PostProcess(newNode, r);
return true;
}
else
{
Debug.Assert(newNode == currentNode, "Liar! This rule should have returned 'true'");
}
}
context.PostProcess(currentNode, null);
return false;
}
开发者ID:WangWilliam,项目名称:EntityFramework5,代码行数:31,代码来源:RuleProcessor.cs
示例3: ProcessSimplifyCase
/// <summary>
/// We perform the following simple transformation for CaseOps. If every single
/// then/else expression in the CaseOp is equivalent, then we can simply replace
/// the Op with the first then/expression. Specifically,
/// case when w1 then t1 when w2 then t2 ... when wn then tn else e end
/// => t1
/// assuming that t1 is equivalent to t2 is equivalent to ... to e
/// </summary>
/// <param name="context"> Rule Processing context </param>
/// <param name="caseOpNode"> The current subtree for the CaseOp </param>
/// <param name="newNode"> the (possibly) modified subtree </param>
/// <returns> true, if we performed any transformations </returns>
private static bool ProcessSimplifyCase(RuleProcessingContext context, Node caseOpNode, out Node newNode)
{
var caseOp = (CaseOp)caseOpNode.Op;
newNode = caseOpNode;
//
// Can I collapse the entire case-expression into a single expression - yes,
// if all the then/else clauses are the same expression
//
if (ProcessSimplifyCase_Collapse(caseOpNode, out newNode))
{
return true;
}
//
// Can I remove any unnecessary when-then pairs ?
//
if (ProcessSimplifyCase_EliminateWhenClauses(context, caseOp, caseOpNode, out newNode))
{
return true;
}
// Nothing else I can think of
return false;
}
开发者ID:junxy,项目名称:entityframework,代码行数:37,代码来源:ScalarOpRules.cs
示例4: ProcessDistinctOpOfKeys
/// <summary>
/// If the DistinctOp includes all all the keys of the input, than it is unnecessary.
/// Distinct (X, distinct_keys) -> Project( X, distinct_keys) where distinct_keys includes all keys of X.
/// </summary>
/// <param name="context"> Rule processing context </param>
/// <param name="n"> current subtree </param>
/// <param name="newNode"> transformed subtree </param>
/// <returns> transformation status </returns>
private static bool ProcessDistinctOpOfKeys(RuleProcessingContext context, Node n, out Node newNode)
{
var command = context.Command;
var nodeInfo = command.GetExtendedNodeInfo(n.Child0);
var op = (DistinctOp)n.Op;
//If we know the keys of the input and the list of distinct keys includes them all, omit the distinct
if (!nodeInfo.Keys.NoKeys
&& op.Keys.Subsumes(nodeInfo.Keys.KeyVars))
{
var newOp = command.CreateProjectOp(op.Keys);
//Create empty vardef list
var varDefListOp = command.CreateVarDefListOp();
var varDefListNode = command.CreateNode(varDefListOp);
newNode = command.CreateNode(newOp, n.Child0, varDefListNode);
return true;
}
//Otherwise return the node as is
newNode = n;
return false;
}
开发者ID:christiandpena,项目名称:entityframework,代码行数:34,代码来源:DistinctOpRules.cs
示例5: ProcessSetOpOverEmptySet
/// <summary>
/// Process a SetOp when one of the inputs is an emptyset.
///
/// An emptyset is represented by a Filter(X, ConstantPredicate)
/// where the ConstantPredicate has a value of "false"
///
/// The general rules are
/// UnionAll(X, EmptySet) => X
/// UnionAll(EmptySet, X) => X
/// Intersect(EmptySet, X) => EmptySet
/// Intersect(X, EmptySet) => EmptySet
/// Except(EmptySet, X) => EmptySet
/// Except(X, EmptySet) => X
///
/// These rules then translate into
/// UnionAll: return the non-empty input
/// Intersect: return the empty input
/// Except: return the "left" input
/// </summary>
/// <param name="context"> Rule processing context </param>
/// <param name="setOpNode"> the current setop tree </param>
/// <param name="filterNodeIndex"> Index of the filter node in the setop </param>
/// <param name="newNode"> transformed subtree </param>
/// <returns> transformation status </returns>
private static bool ProcessSetOpOverEmptySet(RuleProcessingContext context, Node setOpNode, out Node newNode)
{
var leftChildIsEmptySet = context.Command.GetExtendedNodeInfo(setOpNode.Child0).MaxRows == RowCount.Zero;
var rightChildIsEmptySet = context.Command.GetExtendedNodeInfo(setOpNode.Child1).MaxRows == RowCount.Zero;
if (!leftChildIsEmptySet
&& !rightChildIsEmptySet)
{
newNode = setOpNode;
return false;
}
int indexToReturn;
var setOp = (SetOp)setOpNode.Op;
if (!rightChildIsEmptySet && setOp.OpType == OpType.UnionAll
||
!leftChildIsEmptySet && setOp.OpType == OpType.Intersect)
{
indexToReturn = 1;
}
else
{
indexToReturn = 0;
}
newNode = setOpNode.Children[indexToReturn];
var trc = (TransformationRulesContext)context;
foreach (var kv in setOp.VarMap[indexToReturn])
{
trc.AddVarMapping(kv.Key, kv.Value);
}
return true;
}
开发者ID:junxy,项目名称:entityframework,代码行数:58,代码来源:SetOpRules.cs
示例6: ProcessFilterOverFilter
/// <summary>
/// Convert Filter(Filter(X, p1), p2) => Filter(X, (p1 and p2))
/// </summary>
/// <param name="context"> rule processing context </param>
/// <param name="filterNode"> FilterOp node </param>
/// <param name="newNode"> modified subtree </param>
/// <returns> transformed subtree </returns>
private static bool ProcessFilterOverFilter(RuleProcessingContext context, Node filterNode, out Node newNode)
{
var newAndNode = context.Command.CreateNode(
context.Command.CreateConditionalOp(OpType.And),
filterNode.Child0.Child1, filterNode.Child1);
newNode = context.Command.CreateNode(context.Command.CreateFilterOp(), filterNode.Child0.Child0, newAndNode);
return true;
}
开发者ID:jwanagel,项目名称:jjwtest,代码行数:16,代码来源:FilterOpRules.cs
示例7: ProcessProjectOverProject
/// <summary>
/// Converts a Project(Project(X, c1,...), d1,...) =>
/// Project(X, d1', d2'...)
/// where d1', d2' etc. are the "mapped" versions of d1, d2 etc.
/// </summary>
/// <param name="context"> Rule processing context </param>
/// <param name="projectNode"> Current ProjectOp node </param>
/// <param name="newNode"> modified subtree </param>
/// <returns> Transformation status </returns>
private static bool ProcessProjectOverProject(RuleProcessingContext context, Node projectNode, out Node newNode)
{
newNode = projectNode;
var projectOp = (ProjectOp)projectNode.Op;
var varDefListNode = projectNode.Child1;
var subProjectNode = projectNode.Child0;
var subProjectOp = (ProjectOp)subProjectNode.Op;
var trc = (TransformationRulesContext)context;
// If any of the defining expressions is not a scalar op tree, then simply
// quit
var varRefMap = new Dictionary<Var, int>();
foreach (var varDefNode in varDefListNode.Children)
{
if (!trc.IsScalarOpTree(varDefNode.Child0, varRefMap))
{
return false;
}
}
var varMap = trc.GetVarMap(subProjectNode.Child1, varRefMap);
if (varMap == null)
{
return false;
}
// create a new varDefList node...
var newVarDefListNode = trc.Command.CreateNode(trc.Command.CreateVarDefListOp());
// Remap any local definitions, I have
foreach (var varDefNode in varDefListNode.Children)
{
// update the defining expression
varDefNode.Child0 = trc.ReMap(varDefNode.Child0, varMap);
trc.Command.RecomputeNodeInfo(varDefNode);
newVarDefListNode.Children.Add(varDefNode);
}
// Now, pull up any definitions of the subProject that I publish myself
var projectNodeInfo = trc.Command.GetExtendedNodeInfo(projectNode);
foreach (var chi in subProjectNode.Child1.Children)
{
var varDefOp = (VarDefOp)chi.Op;
if (projectNodeInfo.Definitions.IsSet(varDefOp.Var))
{
newVarDefListNode.Children.Add(chi);
}
}
//
// now that we have remapped all our computed vars, simply bypass the subproject
// node
//
projectNode.Child0 = subProjectNode.Child0;
projectNode.Child1 = newVarDefListNode;
return true;
}
开发者ID:christiandpena,项目名称:entityframework,代码行数:66,代码来源:ProjectOpRules.cs
示例8: ProcessSingleRowOpOverProject
// <summary>
// Convert
// SingleRowOp(Project) => Project(SingleRowOp)
// </summary>
// <param name="context"> Rule Processing context </param>
// <param name="singleRowNode"> current subtree </param>
// <param name="newNode"> transformeed subtree </param>
// <returns> transformation status </returns>
private static bool ProcessSingleRowOpOverProject(RuleProcessingContext context, Node singleRowNode, out Node newNode)
{
newNode = singleRowNode;
var projectNode = singleRowNode.Child0;
var projectNodeInput = projectNode.Child0;
// Simply push the SingleRowOp below the ProjectOp
singleRowNode.Child0 = projectNodeInput;
context.Command.RecomputeNodeInfo(singleRowNode);
projectNode.Child0 = singleRowNode;
newNode = projectNode;
return true; // subtree modified internally
}
开发者ID:Cireson,项目名称:EntityFramework6,代码行数:22,代码来源:SingleRowOpRules.cs
示例9: ProcessConstrainedSortOpOverEmptySet
// <summary>
// If the ConstrainedSortOp's input is guaranteed to produce no rows, remove the ConstrainedSortOp completly:
// CSort(EmptySet) => EmptySet
// </summary>
// <param name="context"> Rule processing context </param>
// <param name="n"> current subtree </param>
// <param name="newNode"> transformed subtree </param>
// <returns> transformation status </returns>
private static bool ProcessConstrainedSortOpOverEmptySet(RuleProcessingContext context, Node n, out Node newNode)
{
var nodeInfo = (context).Command.GetExtendedNodeInfo(n.Child0);
//If the input has no rows, remove the ConstraintSortOp node completly
if (nodeInfo.MaxRows
== RowCount.Zero)
{
newNode = n.Child0;
return true;
}
newNode = n;
return false;
}
开发者ID:Cireson,项目名称:EntityFramework6,代码行数:23,代码来源:ConstrainedSortOpRules.cs
示例10: ProcessSortOpOverAtMostOneRow
/// <summary>
/// If the SortOp's input is guaranteed to produce at most 1 row, remove the node with the SortOp:
/// Sort(X) => X, if X is guaranteed to produce no more than 1 row
/// </summary>
/// <param name="context">Rule processing context</param>
/// <param name="n">current subtree</param>
/// <param name="newNode">transformed subtree</param>
/// <returns>transformation status</returns>
private static bool ProcessSortOpOverAtMostOneRow(RuleProcessingContext context, Node n, out Node newNode)
{
var nodeInfo = (context).Command.GetExtendedNodeInfo(n.Child0);
//If the input has at most one row, omit the SortOp
if (nodeInfo.MaxRows == RowCount.Zero
|| nodeInfo.MaxRows == RowCount.One)
{
newNode = n.Child0;
return true;
}
//Otherwise return the node as is
newNode = n;
return false;
}
开发者ID:WangWilliam,项目名称:EntityFramework5,代码行数:24,代码来源:SortOpRules.cs
示例11: ProcessFlattenCase
/// <summary>
/// If the else clause of the CaseOp is another CaseOp, when two can be collapsed into one.
/// In particular,
///
/// CASE
/// WHEN W1 THEN T1
/// WHEN W2 THEN T2 ...
/// ELSE (CASE
/// WHEN WN1 THEN TN1, …
/// ELSE E)
///
/// Is transformed into
///
/// CASE
/// WHEN W1 THEN T1
/// WHEN W2 THEN T2 ...
/// WHEN WN1 THEN TN1 ...
/// ELSE E
/// </summary>
/// <param name="caseOp"> the current caseOp </param>
/// <param name="caseOpNode"> current subtree </param>
/// <param name="newNode"> new subtree </param>
/// <returns> true, if we performed a transformation </returns>
private static bool ProcessFlattenCase(RuleProcessingContext context, Node caseOpNode, out Node newNode)
{
newNode = caseOpNode;
var elseChild = caseOpNode.Children[caseOpNode.Children.Count - 1];
if (elseChild.Op.OpType
!= OpType.Case)
{
return false;
}
//
// Flatten the case statements.
// The else child is removed from the outer CaseOp op
// and the else child's children are reparented to the outer CaseOp
// Node info recomputation does not need to happen, the outer CaseOp
// node still has the same descendants.
//
caseOpNode.Children.RemoveAt(caseOpNode.Children.Count - 1);
caseOpNode.Children.AddRange(elseChild.Children);
return true;
}
开发者ID:junxy,项目名称:entityframework,代码行数:45,代码来源:ScalarOpRules.cs
示例12: ProcessSimplifyCase_EliminateWhenClauses
private static bool ProcessSimplifyCase_EliminateWhenClauses(
RuleProcessingContext context, CaseOp caseOp, Node caseOpNode, out Node newNode)
{
List<Node> newNodeArgs = null;
newNode = caseOpNode;
for (var i = 0; i < caseOpNode.Children.Count;)
{
// Special handling for the else clause
if (i == caseOpNode.Children.Count - 1)
{
// If the else clause is a SoftCast then we do not attempt to simplify
// the case operation, since this may change the result type.
// This really belongs in more general SoftCastOp logic in the CTreeGenerator
// that converts SoftCasts that could affect the result type of the query into
// a real cast or a trivial case statement, to preserve the result type.
// This is tracked by SQL PT Work Item #300003327.
if (OpType.SoftCast
== caseOpNode.Children[i].Op.OpType)
{
return false;
}
if (newNodeArgs != null)
{
newNodeArgs.Add(caseOpNode.Children[i]);
}
break;
}
// If the current then clause is a SoftCast then we do not attempt to simplify
// the case operation, since this may change the result type.
// Again, this really belongs in the CTreeGenerator as per SQL PT Work Item #300003327.
if (OpType.SoftCast
== caseOpNode.Children[i + 1].Op.OpType)
{
return false;
}
// Check to see if the when clause is a ConstantPredicate
if (caseOpNode.Children[i].Op.OpType
!= OpType.ConstantPredicate)
{
if (newNodeArgs != null)
{
newNodeArgs.Add(caseOpNode.Children[i]);
newNodeArgs.Add(caseOpNode.Children[i + 1]);
}
i += 2;
continue;
}
// Found a when-clause which is a constant predicate
var constPred = (ConstantPredicateOp)caseOpNode.Children[i].Op;
// Create the newArgs list, if we haven't done so already
if (newNodeArgs == null)
{
newNodeArgs = new List<Node>();
for (var j = 0; j < i; j++)
{
newNodeArgs.Add(caseOpNode.Children[j]);
}
}
// If the when-clause is the "true" predicate, then we simply ignore all
// the succeeding arguments. We make the "then" clause of this when-clause
// as the "else-clause" of the resulting caseOp
if (constPred.IsTrue)
{
newNodeArgs.Add(caseOpNode.Children[i + 1]);
break;
}
else
{
// Otherwise, we simply skip the when-then pair
PlanCompiler.Assert(constPred.IsFalse, "constant predicate must be either true or false");
i += 2;
continue;
}
}
// Did we see any changes? Simply return
if (newNodeArgs == null)
{
return false;
}
// Otherwise, we did do some processing
PlanCompiler.Assert(newNodeArgs.Count > 0, "new args list must not be empty");
// Is there only one expression in the args list - simply return that expression
if (newNodeArgs.Count == 1)
{
newNode = newNodeArgs[0];
}
else
{
newNode = context.Command.CreateNode(caseOp, newNodeArgs);
}
return true;
//.........这里部分代码省略.........
开发者ID:junxy,项目名称:entityframework,代码行数:101,代码来源:ScalarOpRules.cs
示例13: ProcessGroupByOverProject
/// <summary>
/// Converts a GroupBy(Project(X, c1,..ck), agg1, agg2, .. aggm) =>
/// GroupBy(X, agg1', agg2', .. aggm')
/// where agg1', agg2', .. aggm' are the "mapped" versions
/// of agg1, agg2, .. aggm, such that the references to c1, ... ck are
/// replaced by their definitions.
/// We only do this if each c1, ..ck is refereneced (in aggregates) at most once or it is a constant.
/// </summary>
/// <param name="context"> Rule processing context </param>
/// <param name="projectNode"> Current ProjectOp node </param>
/// <param name="newNode"> modified subtree </param>
/// <returns> Transformation status </returns>
private static bool ProcessGroupByOverProject(RuleProcessingContext context, Node n, out Node newNode)
{
newNode = n;
var op = (GroupByOp)n.Op;
var command = (context).Command;
var projectNode = n.Child0;
var projectNodeVarDefList = projectNode.Child1;
var keys = n.Child1;
var aggregates = n.Child2;
// If there are any keys, we should not remove the inner project
if (keys.Children.Count > 0)
{
return false;
}
//Get a list of all defining vars
var projectDefinitions = command.GetExtendedNodeInfo(projectNode).LocalDefinitions;
//If any of the defined vars is output, than we need the extra project anyway.
if (op.Outputs.Overlaps(projectDefinitions))
{
return false;
}
var createdNewProjectDefinitions = false;
//If there are any constants remove them from the list that needs to be tested,
//These can safely be replaced
for (var i = 0; i < projectNodeVarDefList.Children.Count; i++)
{
var varDefNode = projectNodeVarDefList.Children[i];
if (varDefNode.Child0.Op.OpType == OpType.Constant
|| varDefNode.Child0.Op.OpType == OpType.InternalConstant
|| varDefNode.Child0.Op.OpType == OpType.NullSentinel)
{
//We shouldn't modify the original project definitions, thus we copy it
// the first time we encounter a constant
if (!createdNewProjectDefinitions)
{
projectDefinitions = command.CreateVarVec(projectDefinitions);
createdNewProjectDefinitions = true;
}
projectDefinitions.Clear(((VarDefOp)varDefNode.Op).Var);
}
}
if (VarRefUsageFinder.AnyVarUsedMoreThanOnce(projectDefinitions, aggregates, command))
{
return false;
}
//If we got here it means that all vars were either constants, or used at most once
// Create a dictionary to be used for remapping the keys and the aggregates
var varToDefiningNode = new Dictionary<Var, Node>(projectNodeVarDefList.Children.Count);
for (var j = 0; j < projectNodeVarDefList.Children.Count; j++)
{
var varDefNode = projectNodeVarDefList.Children[j];
var var = ((VarDefOp)varDefNode.Op).Var;
varToDefiningNode.Add(var, varDefNode.Child0);
}
newNode.Child2 = VarRefReplacer.Replace(varToDefiningNode, aggregates, command);
newNode.Child0 = projectNode.Child0;
return true;
}
开发者ID:jwanagel,项目名称:jjwtest,代码行数:80,代码来源:GroupByOpRules.cs
示例14: ProcessNullCast
/// <summary>
/// eliminates nested null casts into a single cast of the outermost cast type.
/// basically the transformation applied is: cast(null[x] as T) => null[t]
/// </summary>
/// <param name="context"> </param>
/// <param name="castNullOp"> </param>
/// <param name="newNode"> modified subtree </param>
/// <returns> </returns>
private static bool ProcessNullCast(RuleProcessingContext context, Node castNullOp, out Node newNode)
{
newNode = context.Command.CreateNode(context.Command.CreateNullOp(castNullOp.Op.Type));
return true;
}
开发者ID:junxy,项目名称:entityframework,代码行数:13,代码来源:ScalarOpRules.cs
示例15: ProcessNotOverConstantPredicate
private static bool ProcessNotOverConstantPredicate(RuleProcessingContext context, Node node, out Node newNode)
{
return ProcessLogOpOverConstant(context, node, node.Child0, null, out newNode);
}
开发者ID:junxy,项目名称:entityframework,代码行数:4,代码来源:ScalarOpRules.cs
示例16: ProcessLikeOverConstant
private static bool ProcessLikeOverConstant(RuleProcessingContext context, Node n, out Node newNode)
{
newNode = n;
var patternOp = (InternalConstantOp)n.Child1.Op;
var strOp = (InternalConstantOp)n.Child0.Op;
var str = (string)strOp.Value;
var pattern = (string)patternOp.Value;
var match = MatchesPattern((string)strOp.Value, (string)patternOp.Value);
if (match == null)
{
return false;
}
var constOp = context.Command.CreateConstantPredicateOp((bool)match);
newNode = context.Command.CreateNode(constOp);
return true;
}
开发者ID:junxy,项目名称:entityframework,代码行数:19,代码来源:ScalarOpRules.cs
示例17: ApplyRulesToSubtree
/// <summary>
/// Apply rules to the current subtree in a bottom-up fashion.
/// </summary>
/// <param name="context">Current rule processing context</param>
/// <param name="rules">The look-up table with the rules to be applied</param>
/// <param name="subTreeRoot">Current subtree</param>
/// <param name="parent">Parent node</param>
/// <param name="childIndexInParent">Index of this child within the parent</param>
/// <returns>the result of the transformation</returns>
private Node ApplyRulesToSubtree(
RuleProcessingContext context,
ReadOnlyCollection<ReadOnlyCollection<Rule>> rules,
Node subTreeRoot, Node parent, int childIndexInParent)
{
var loopCount = 0;
var localProcessedMap = new Dictionary<SubTreeId, SubTreeId>();
SubTreeId subTreeId;
while (true)
{
// Am I looping forever
Debug.Assert(loopCount < 12, "endless loops?");
loopCount++;
//
// We may need to update state regardless of whether this subTree has
// changed after it has been processed last. For example, it may be
// affected by transformation in its siblings due to external references.
//
context.PreProcessSubTree(subTreeRoot);
subTreeId = new SubTreeId(context, subTreeRoot, parent, childIndexInParent);
// Have I seen this subtree already? Just return, if so
if (m_processedNodeMap.ContainsKey(subTreeId))
{
break;
}
// Avoid endless loops here - avoid cycles of 2 or more
if (localProcessedMap.ContainsKey(subTreeId))
{
// mark this subtree as processed
m_processedNodeMap[subTreeId] = subTreeId;
break;
}
// Keep track of this one
localProcessedMap[subTreeId] = subTreeId;
// Walk my children
for (var i = 0; i < subTreeRoot.Children.Count; i++)
{
subTreeRoot.Children[i] = ApplyRulesToSubtree(context, rules, subTreeRoot.Children[i], subTreeRoot, i);
}
// Apply rules to myself. If no transformations were performed,
// then mark this subtree as processed, and break out
Node newSubTreeRoot;
if (!ApplyRulesToNode(context, rules, subTreeRoot, out newSubTreeRoot))
{
Debug.Assert(subTreeRoot == newSubTreeRoot);
// mark this subtree as processed
m_processedNodeMap[subTreeId] = subTreeId;
break;
}
context.PostProcessSubTree(subTreeRoot);
subTreeRoot = newSubTreeRoot;
}
context.PostProcessSubTree(subTreeRoot);
return subTreeRoot;
}
开发者ID:WangWilliam,项目名称:EntityFramework5,代码行数:71,代码来源:RuleProcessor.cs
示例18: ProcessIsNullOverAnything
private static bool ProcessIsNullOverAnything(RuleProcessingContext context, Node isNullNode, out Node newNode)
{
Debug.Assert(isNullNode.Op.OpType == OpType.IsNull);
var command = context.Command;
switch (isNullNode.Child0.Op.OpType)
{
case OpType.Cast:
newNode = command.CreateNode(
command.CreateConditionalOp(OpType.IsNull),
isNullNode.Child0.Child0);
break;
case OpType.Function:
var function = ((FunctionOp)isNullNode.Child0.Op).Function;
newNode = PreservesNulls(function)
? command.CreateNode(
command.CreateConditionalOp(OpType.IsNull),
isNullNode.Child0.Child0)
: isNullNode;
break;
default:
newNode = isNullNode;
break;
}
switch (isNullNode.Child0.Op.OpType)
{
case OpType.Constant:
case OpType.InternalConstant:
case OpType.NullSentinel:
return ProcessIsNullOverConstant(context, newNode, out newNode);
case OpType.Null:
return ProcessIsNullOverNull(context, newNode, out newNode);
case OpType.VarRef:
return ProcessIsNullOverVarRef(context, newNode, out newNode);
default:
return !ReferenceEquals(isNullNode, newNode);
}
}
开发者ID:Cireson,项目名称:EntityFramework6,代码行数:40,代码来源:ScalarOpRules.cs
示例19: ProcessGroupByOpWithNoAggregates
/// <summary>
/// If the GroupByOp has no aggregates:
/// (1) and if it includes all all the keys of the input, than it is unnecessary
/// GroupBy (X, keys) -> Project(X, keys) where keys includes all keys of X.
/// (2) else it can be turned into a Distinct:
/// GroupBy (X, keys) -> Distinct(X, keys)
/// </summary>
/// <param name="context"> Rule processing context </param>
/// <param name="n"> current subtree </param>
/// <param name="newNode"> transformed subtree </param>
/// <returns> transformation status </returns>
private static bool ProcessGroupByOpWithNoAggregates(RuleProcessingContext context, Node n, out Node newNode)
{
var command = context.Command;
var op = (GroupByOp)n.Op;
var nodeInfo = command.GetExtendedNodeInfo(n.Child0);
var newOp = command.CreateProjectOp(op.Keys);
var varDefListOp = command.CreateVarDefListOp();
var varDefListNode = command.CreateNode(varDefListOp);
newNode = command.CreateNode(newOp, n.Child0, n.Child1);
//If we know the keys of the input and the list of keys includes them all,
// this is the result, otherwise add distinct
if (nodeInfo.Keys.NoKeys
|| !op.Keys.Subsumes(nodeInfo.Keys.KeyVars))
{
newNode = command.CreateNode(command.CreateDistinctOp(command.CreateVarVec(op.Keys)), newNode);
}
return true;
}
开发者ID:jwanagel,项目名称:jjwtest,代码行数:33,代码来源:GroupByOpRules.cs
示例20: ProcessGroupByWithSimpleVarRedefinitions
/// <summary>
/// If the GroupByOp defines some computedVars as part of its keys, but those computedVars are simply
/// redefinitions of other Vars, then eliminate the computedVars.
/// GroupBy(X, VarDefList(VarDef(cv1, VarRef(v1)), ...), VarDefList(...))
/// can be transformed into
/// GroupBy(X, VarDefList(...))
/// where cv1 has now been replaced by v1
/// </summary>
/// <param name="context"> Rule processing context </param>
/// <param name="n"> current subtree </param>
/// <param name="newNode"> transformed subtree </param>
/// <returns> transformation status </returns>
private static bool ProcessGroupByWithSimpleVarRedefinitions(RuleProcessingContext context, Node n, out Node newNode)
{
newNode = n;
var groupByOp = (GroupByOp)n.Op;
// no local keys? nothing to do
if (n.Child1.Children.Count == 0)
{
return false;
}
var trc = (TransformationRulesContext)context;
var command = trc.Command;
var nodeInfo = command.GetExtendedNodeInfo(n);
//
// Check to see if any of the computed Vars defined by this GroupByOp
// are simple redefinitions of other VarRefOps. Consider only those
// VarRefOps that are not "external" references
//
var canEliminateSomeVars = false;
foreach (var varDefNode in n.Child1.Children)
{
var definingExprNode = varDefNode.Child0;
if (definingExprNode.Op.OpType
== OpType.VarRef)
{
var varRefOp = (VarRefOp)definingExprNode.Op;
if (!nodeInfo.ExternalReferences.IsSet(varRefOp.Var))
{
// this is a Var that we should remove
canEliminateSomeVars = true;
}
}
}
// Did we have any redefinitions
if (!canEliminateSomeVa
|
请发表评论