/// <summary>
 /// Join an enumeration of elements to the pipeline
 /// </summary>
 /// <param name="observed">observed operation</param>
 /// <param name="rightOp">operation to join</param>
 /// <param name="field">Name of the field used for the join</param>
 /// <param name="processrow">callback method called to process the row</param>
 /// <returns>resulting operation</returns>
 public static JoinOperation <Row> FullJoin(this IObservableOperation observed, IEnumerable <Row> rightOp, string field, Func <Row, Row, Row> processrow)
 {
     return(observed.Join(
                rightOp,
                new RowJoinHelper(field).FullJoinMatch,
                processrow));
 }
 /// <summary>
 /// Join an enumeration of elements to the pipeline
 /// </summary>
 /// <param name="observed">observed operation</param>
 /// <param name="rightOp">operation to join</param>
 /// <param name="leftField">Name of the field used for the join</param>
 /// <param name="rightField">Name of the field used for the join</param>
 /// <param name="processrow">callback method called to process the row</param>
 /// <returns>resulting operation</returns>
 public static JoinOperation <Row> RightJoin(this IObservableOperation observed, IEnumerable <Row> rightOp, string leftField, string rightField, Func <Row, Row, Row> processrow)
 {
     return(observed.Join(
                rightOp,
                new RowJoinHelper(leftField, rightField).RightJoinMatch,
                processrow));
 }
        /// <summary>
        /// Join an enumeration of elements to the pipeline
        /// </summary>
        /// <param name="observed">observed operation</param>
        /// <param name="rightOp">operation to join</param>
        /// <param name="checkMatch">callback method to check if an element is matching the row</param>
        /// <param name="processrow">callback method called to process the row</param>
        /// <returns>resulting operation</returns>
        public static JoinOperation <Row> Join(this IObservableOperation observed, IObservableOperation rightOp, Func <Row, Row, bool> checkMatch, Func <Row, Row, Row> processrow)
        {
            var activator = new OperationJoinActivator();

            activator.Operation  = rightOp;
            activator.CheckMatch = checkMatch;
            activator.ProcessRow = processrow;

            return(observed.Join(activator));
        }
        /// <summary>
        /// Join an enumeration of elements to the pipeline
        /// </summary>
        /// <typeparam name="T">type of elements to join</typeparam>
        /// <param name="observed">observed operation</param>
        /// <param name="list">enumeration of elements to join</param>
        /// <param name="checkMatch">callback method to check if an element is matching the row</param>
        /// <param name="processrow">callback method called to process the row</param>
        /// <returns>resulting operation</returns>
        public static JoinOperation <T> Join <T>(this IObservableOperation observed, IEnumerable <T> list, Func <Row, T, bool> checkMatch, Func <Row, T, Row> processrow)
        {
            var activator = new JoinActivator <T>();

            activator.List       = list;
            activator.CheckMatch = checkMatch;
            activator.ProcessRow = processrow;

            return(observed.Join(activator));
        }