/// <summary> /// Get OptimizerPatterns annotation for the specified node. Lazily create if necessary. /// </summary> public static OptimizerPatterns Read(QilNode nd) { XmlILAnnotation ann = nd.Annotation as XmlILAnnotation; OptimizerPatterns optPatt = (ann != null) ? ann.Patterns : null; if (optPatt == null) { if (!nd.XmlType.MaybeMany) { // Expressions with ZeroOrOne cardinality should always report IsDocOrderDistinct and NoContainedNodes if (s_zeroOrOneDefault == null) { optPatt = new OptimizerPatterns(); optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.AddPattern(OptimizerPatternName.SameDepth); optPatt._isReadOnly = true; s_zeroOrOneDefault = optPatt; } else { optPatt = s_zeroOrOneDefault; } } else if (nd.XmlType.IsDod) { if (s_dodDefault == null) { optPatt = new OptimizerPatterns(); optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt._isReadOnly = true; s_dodDefault = optPatt; } else { optPatt = s_dodDefault; } } else { if (s_maybeManyDefault == null) { optPatt = new OptimizerPatterns(); optPatt._isReadOnly = true; s_maybeManyDefault = optPatt; } else { optPatt = s_maybeManyDefault; } } } return(optPatt); }
//----------------------------------------------- // Constructor //----------------------------------------------- /// <summary> /// Create and initialize XmlILAnnotation for the specified node. /// </summary> public static XmlILAnnotation Write(QilNode nd) { XmlILAnnotation ann = nd.Annotation as XmlILAnnotation; if (ann == null) { ann = new XmlILAnnotation(nd.Annotation); nd.Annotation = ann; } return(ann); }
/// <summary> /// Create and initialize XmlILConstructInfo annotation for the specified node. /// </summary> public static XmlILConstructInfo Write(QilNode nd) { XmlILAnnotation ann = XmlILAnnotation.Write(nd); XmlILConstructInfo constrInfo = ann.ConstructInfo; if (constrInfo == null || constrInfo._isReadOnly) { constrInfo = new XmlILConstructInfo(nd.NodeType); ann.ConstructInfo = constrInfo; } return(constrInfo); }
/// <summary> /// Get ConstructInfo annotation for the specified node. Lazily create if necessary. /// </summary> public static XmlILConstructInfo Read(QilNode nd) { XmlILAnnotation ann = nd.Annotation as XmlILAnnotation; XmlILConstructInfo constrInfo = (ann != null) ? ann.ConstructInfo : null; if (constrInfo == null) { if (s_default == null) { constrInfo = new XmlILConstructInfo(QilNodeType.Unknown); constrInfo._isReadOnly = true; s_default = constrInfo; } else { constrInfo = s_default; } } return(constrInfo); }
/// <summary> /// Create and initialize OptimizerPatterns annotation for the specified node. /// </summary> public static OptimizerPatterns Write(QilNode nd) { XmlILAnnotation ann = XmlILAnnotation.Write(nd); OptimizerPatterns optPatt = ann.Patterns; if (optPatt == null || optPatt._isReadOnly) { optPatt = new OptimizerPatterns(); ann.Patterns = optPatt; if (!nd.XmlType.MaybeMany) { optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.AddPattern(OptimizerPatternName.SameDepth); } else if (nd.XmlType.IsDod) { optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); } } return(optPatt); }