// <summary> // Construct a new placeholder with the shape of the given placeholder. Key values are // injected into the resulting place holder and default values are substituted with // either propagator constants or progagator nulls depending on the mode established // by the <paramref name="mode" /> flag. // </summary> // <remarks> // The key is essentially an array of values. The key map indicates that for a particular // placeholder an expression (keyMap.Keys) corresponds to some ordinal in the key array. // </remarks> // <param name="placeholder"> Placeholder to clone </param> // <param name="key"> Key to substitute </param> // <param name="placeholderKey"> Key elements in the placeholder (ordinally aligned with 'key') </param> // <param name="mode"> Mode of operation. </param> // <returns> Cloned placeholder with key values </returns> internal static PropagatorResult Populate( PropagatorResult placeholder, CompositeKey key, CompositeKey placeholderKey, PopulateMode mode) { DebugCheck.NotNull(placeholder); DebugCheck.NotNull(key); DebugCheck.NotNull(placeholderKey); // Figure out which flags to apply to generated elements. var isNull = mode == PopulateMode.NullModified || mode == PopulateMode.NullPreserve; var preserve = mode == PopulateMode.NullPreserve || mode == PopulateMode.Unknown; var flags = PropagatorFlags.NoFlags; if (!isNull) { flags |= PropagatorFlags.Unknown; } // only null values are known if (preserve) { flags |= PropagatorFlags.Preserve; } var result = placeholder.Replace( node => { // See if this is a key element var keyIndex = -1; for (var i = 0; i < placeholderKey.KeyComponents.Length; i++) { if (placeholderKey.KeyComponents[i] == node) { keyIndex = i; break; } } if (keyIndex != -1) { // Key value. return(key.KeyComponents[keyIndex]); } else { // for simple entries, just return using the markup context for this // populator var value = isNull ? null : node.GetSimpleValue(); return(PropagatorResult.CreateSimpleValue(flags, value)); } }); return(result); }
// <summary> // Construct a new placeholder with the shape of the given placeholder. Key values are // injected into the resulting place holder and default values are substituted with // either propagator constants or progagator nulls depending on the mode established // by the <paramref name="mode" /> flag. // </summary> // <remarks> // The key is essentially an array of values. The key map indicates that for a particular // placeholder an expression (keyMap.Keys) corresponds to some ordinal in the key array. // </remarks> // <param name="placeholder"> Placeholder to clone </param> // <param name="key"> Key to substitute </param> // <param name="placeholderKey"> Key elements in the placeholder (ordinally aligned with 'key') </param> // <param name="mode"> Mode of operation. </param> // <returns> Cloned placeholder with key values </returns> internal static PropagatorResult Populate( PropagatorResult placeholder, CompositeKey key, CompositeKey placeholderKey, PopulateMode mode) { DebugCheck.NotNull(placeholder); DebugCheck.NotNull(key); DebugCheck.NotNull(placeholderKey); // Figure out which flags to apply to generated elements. var isNull = mode == PopulateMode.NullModified || mode == PopulateMode.NullPreserve; var preserve = mode == PopulateMode.NullPreserve || mode == PopulateMode.Unknown; var flags = PropagatorFlags.NoFlags; if (!isNull) { flags |= PropagatorFlags.Unknown; } // only null values are known if (preserve) { flags |= PropagatorFlags.Preserve; } var result = placeholder.Replace( node => { // See if this is a key element var keyIndex = -1; for (var i = 0; i < placeholderKey.KeyComponents.Length; i++) { if (placeholderKey.KeyComponents[i] == node) { keyIndex = i; break; } } if (keyIndex != -1) { // Key value. return key.KeyComponents[keyIndex]; } else { // for simple entries, just return using the markup context for this // populator var value = isNull ? null : node.GetSimpleValue(); return PropagatorResult.CreateSimpleValue(flags, value); } }); return result; }
/// <summary> /// Construct a new placeholder with the shape of the given placeholder. Key values are /// injected into the resulting place holder and default values are substituted with /// either propagator constants or progagator nulls depending on the mode established /// by the <paramref name="mode"/> flag. /// </summary> /// <remarks> /// The key is essentially an array of values. The key map indicates that for a particular /// placeholder an expression (keyMap.Keys) corresponds to some ordinal in the key array. /// </remarks> /// <param name="placeholder">Placeholder to clone</param> /// <param name="key">Key to substitute</param> /// <param name="placeholderKey">Key elements in the placeholder (ordinally aligned with 'key')</param> /// <param name="mode">Mode of operation.</param> /// <param name="translator">Translator context.</param> /// <returns>Cloned placeholder with key values</returns> internal static PropagatorResult Populate(PropagatorResult placeholder, CompositeKey key, CompositeKey placeholderKey, PopulateMode mode, UpdateTranslator translator) { EntityUtil.CheckArgumentNull(placeholder, "placeholder"); EntityUtil.CheckArgumentNull(key, "key"); EntityUtil.CheckArgumentNull(placeholderKey, "placeholderKey"); EntityUtil.CheckArgumentNull(translator, "translator"); // Figure out which flags to apply to generated elements. bool isNull = mode == PopulateMode.NullModified || mode == PopulateMode.NullPreserve; bool preserve = mode == PopulateMode.NullPreserve || mode == PopulateMode.Unknown; PropagatorFlags flags = PropagatorFlags.NoFlags; if (!isNull) { flags |= PropagatorFlags.Unknown; } // only null values are known if (preserve) { flags |= PropagatorFlags.Preserve; } PropagatorResult result = placeholder.Replace(node => { // See if this is a key element int keyIndex = -1; for (int i = 0; i < placeholderKey.KeyComponents.Length; i++) { if (placeholderKey.KeyComponents[i] == node) { keyIndex = i; break; } } if (keyIndex != -1) { // Key value. return key.KeyComponents[keyIndex]; } else { // for simple entries, just return using the markup context for this // populator object value = isNull ? null : node.GetSimpleValue(); return PropagatorResult.CreateSimpleValue(flags, value); } }); return result; }
/// <summary> /// See <see cref="LeftPlaceholder"></see> /// </summary> /// <param name="key"> </param> /// <param name="mode"> </param> /// <returns> </returns> private PropagatorResult RightPlaceholder(CompositeKey key, PopulateMode mode) { return PlaceholderPopulator.Populate(m_right.Placeholder, key, m_rightPlaceholderKey, mode); }
/// <summary> /// See <see cref="LeftPlaceholder"></see> /// </summary> /// <param name="key"></param> /// <param name="mode"></param> /// <returns></returns> private PropagatorResult RightPlaceholder(CompositeKey key, PopulateMode mode) { return(PlaceholderPopulator.Populate(m_right.Placeholder, key, m_rightPlaceholderKey, mode, m_parent.UpdateTranslator)); }
/// <summary> /// Constructs a new placeholder record for the left hand side of the join. Values taken /// from the join key are injected into the record. /// </summary> /// <param name="key">Key producing the left hand side.</param> /// <param name="mode">Mode used to populate the placeholder</param> /// <returns>Record corresponding to the type of the left input to the join. Each value in /// the record is flagged as <see cref="PropagatorFlags.Unknown" /> except when it is /// a component of the key.</returns> private PropagatorResult LeftPlaceholder(CompositeKey key, PopulateMode mode) { return PlaceholderPopulator.Populate(m_left.Placeholder, key, m_leftPlaceholderKey, mode, m_parent.UpdateTranslator); }
// <summary> // Constructs a new placeholder record for the left hand side of the join. Values taken // from the join key are injected into the record. // </summary> // <param name="key"> Key producing the left hand side. </param> // <param name="mode"> Mode used to populate the placeholder </param> // <returns> // Record corresponding to the type of the left input to the join. Each value in the record is flagged as // <see // cref="PropagatorFlags.Unknown" /> // except when it is a component of the key. // </returns> private PropagatorResult LeftPlaceholder(CompositeKey key, PopulateMode mode) { return(PlaceholderPopulator.Populate(m_left.Placeholder, key, m_leftPlaceholderKey, mode)); }
/// <summary> /// Construct a new placeholder with the shape of the given placeholder. Key values are /// injected into the resulting place holder and default values are substituted with /// either propagator constants or progagator nulls depending on the mode established /// by the <paramref name="mode"/> flag. /// </summary> /// <remarks> /// The key is essentially an array of values. The key map indicates that for a particular /// placeholder an expression (keyMap.Keys) corresponds to some ordinal in the key array. /// </remarks> /// <param name="placeholder">Placeholder to clone</param> /// <param name="key">Key to substitute</param> /// <param name="placeholderKey">Key elements in the placeholder (ordinally aligned with 'key')</param> /// <param name="mode">Mode of operation.</param> /// <param name="translator">Translator context.</param> /// <returns>Cloned placeholder with key values</returns> internal static PropagatorResult Populate(PropagatorResult placeholder, CompositeKey key, CompositeKey placeholderKey, PopulateMode mode, UpdateTranslator translator) { EntityUtil.CheckArgumentNull(placeholder, "placeholder"); EntityUtil.CheckArgumentNull(key, "key"); EntityUtil.CheckArgumentNull(placeholderKey, "placeholderKey"); EntityUtil.CheckArgumentNull(translator, "translator"); // Figure out which flags to apply to generated elements. bool isNull = mode == PopulateMode.NullModified || mode == PopulateMode.NullPreserve; bool preserve = mode == PopulateMode.NullPreserve || mode == PopulateMode.Unknown; PropagatorFlags flags = PropagatorFlags.NoFlags; if (!isNull) { flags |= PropagatorFlags.Unknown; } // only null values are known if (preserve) { flags |= PropagatorFlags.Preserve; } PropagatorResult result = placeholder.Replace(node => { // See if this is a key element int keyIndex = -1; for (int i = 0; i < placeholderKey.KeyComponents.Length; i++) { if (placeholderKey.KeyComponents[i] == node) { keyIndex = i; break; } } if (keyIndex != -1) { // Key value. return(key.KeyComponents[keyIndex]); } else { // for simple entries, just return using the markup context for this // populator object value = isNull ? null : node.GetSimpleValue(); return(PropagatorResult.CreateSimpleValue(flags, value)); } }); return(result); }