예제 #1
0
        protected override List <TplResult> InnerProcess(List <TplResult> inputs)
        {
            var results = new List <TplResult>();

            if (inputs.Count > 0)
            {
                results.Add(inputs[0]);

                var targetFields = TargetFields == null || !TargetFields.Any() ? inputs.GetAllFields() : TargetFields;

                if (Mode == DedupMode.All)
                {
                    for (int j = 1; j < inputs.Count; j++)
                    {
                        var  input        = inputs[j];
                        bool alreadyAdded = false;

                        for (int i = 0; i < results.Count; i++)
                        {
                            var result = results[i];

                            alreadyAdded |= result.Matches(input, targetFields);

                            if (alreadyAdded)
                            {
                                if (SortMode == DedupSort.Last)
                                {
                                    results[i] = input;
                                }
                                break;
                            }
                        }

                        if (!alreadyAdded)
                        {
                            results.Add(input);
                        }
                    }
                }

                else if (Mode == DedupMode.Consecutive)
                {
                    foreach (var result in inputs)
                    {
                        if (!result.Matches(results.Last(), targetFields))
                        {
                            results.Add(result);
                        }
                    }
                }
            }

            return(results);
        }
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            //Message Type
            sb.Append(Type.ToString());
            //Requestid
            sb.Append(String.Format("~{0}", RequestId.ToString()));
            //UnitNumber
            sb.Append(String.Format("~A{0}", UnitNumber));
            //VendorId
            sb.Append(String.Format("~B{0}", VendorName));
            //D-F CardNumber based access
            sb.Append(String.Format("~DCARD~F{0}{1}", CardNumber, SourceAccount));
            //G and H fields Repgen Name / Locator Names
            sb.Append(Type == SymConnectMessageType.RG ? String.Format("~G{0}", Repgen.RepgenName) : String.Empty);
            //H - record locator
            sb.Append(Type == SymConnectMessageType.IQ || Type == SymConnectMessageType.FM ? FormatSourceRecord() : String.Empty);
            //Optional J params for FM
            sb.Append(Type == SymConnectMessageType.FM && FmType != null ? String.Format("~JFMTYPE={0}", (int)FmType.Value) : String.Empty);
            //J Params .. For Repgen calls, this is JRGSESSION, etc. For IQs this is our record locators, for FMs this is our revised fields, for TRS, nothing
            sb.Append(
                Type == SymConnectMessageType.RG
                //RG J params
                    ? Repgen.RepgenParameters.Aggregate(String.Empty,
                                                        (x, y) => x + String.Format("~JRG{0}={1}", y.Key, y.Value)) +
                String.Format("~JRGSESSION={0}", Repgen.RepgenSession)
                //TR, nothing
                    : Type == SymConnectMessageType.TR
                        ? String.Empty
                //IQ source fields
                        : Type == SymConnectMessageType.IQ
                            ? SourceFields.Aggregate(String.Empty, (x, y) => x + String.Format("~J{0}", y))
                //FM fields
                            : Type == SymConnectMessageType.FM
                                ? TargetFields.Aggregate(String.Empty,
                                                         (s, pair) => s + String.Format("~J{0}={1}", pair.Key, pair.Value))
                                : String.Empty);



            return(sb.ToString());
        }
 private void ValidateSymConnectContent()
 {
     //if the repgen name or parameters contain reserved characters, throw an exception
     if (Type == SymConnectMessageType.RG && (ContainsReservedChars(Repgen.RepgenName) ||
                                              Repgen.RepgenParameters.Aggregate(false, (agg, kvp) => agg || ContainsReservedChars(kvp.Key) || ContainsReservedChars(kvp.Value))))
     {
         throw new InvalidOperationException("Repgen name or parameters cannot contain symconnect reserved characters");
     }
     //if any of the source fields contain reserved characters, throw an exception
     if (Type == SymConnectMessageType.IQ && SourceFields.Aggregate(false, (agg, str) => agg || ContainsReservedChars(str)))
     {
         throw new InvalidOperationException("Source fields for iq cannot contain symconnect reserved characters");
     }
     //if any of the target fields contain reserved characters, throw an exception
     if (Type == SymConnectMessageType.FM &&
         TargetFields.Aggregate(false,
                                (agg, kvp) => agg || ContainsReservedChars(kvp.Key) || ContainsReservedChars(kvp.Value)))
     {
         throw new InvalidOperationException("Target fields for fm cannot contain symconnect reserved characters");
     }
 }
 public bool CheckField(TargetFields fieldToCheck)
 {
     return(((int)targetField & (int)fieldToCheck) == (int)fieldToCheck);
 }
예제 #5
0
        protected override List <TplResult> InnerProcess(List <TplResult> input)
        {
            if ((Sum || Avg) && !TargetFields.Any())
            {
                throw new InvalidOperationException("Stats function requires at least one target field to be specified when calculating sum/average");
            }

            if (!input.Any())
            {
                return(input);
            }

            var results = new List <TplResult>();

            // If no 'By Fields' are specified, all results will end up in one big group
            var groupByResult = input
                                .GroupBy(r => ByFields.Aggregate("", (t, b) => t + r.StringValueOf(b)))
                                .Select(g => new
            {
                FinalResult = g.First().Copy(),
                WholeGroup  = g.ToList(),
                Sums        = TargetFields.ToDictionary(f => f, _ => 0.0)
            })
                                .ToList();

            var tplSelectFields = ByFields.ToList();

            // Target fields do not matter for Count
            if (Count)
            {
                foreach (var group in groupByResult)
                {
                    var newField = "Count";
                    group.FinalResult.AddOrUpdateField(newField, group.WholeGroup.Count);
                    tplSelectFields.Add(newField);
                }
            }

            // Target fields must be specified for Sum and Avg
            if (Sum || Avg)
            {
                //Calculate the Sum (Needed for average anyway)
                foreach (var group in groupByResult)
                {
                    foreach (var field in TargetFields)
                    {
                        var value = group.WholeGroup.Aggregate(0.0, (total, next) => total + next.NumericValueOf(field));
                        group.Sums[field] = value;
                        if (Sum)
                        {
                            var newField = field + "_Sum";
                            group.FinalResult.AddOrUpdateField(newField, value);
                            tplSelectFields.Add(newField);
                        }
                    }
                }

                if (Avg)
                {
                    foreach (var group in groupByResult)
                    {
                        foreach (var field in TargetFields)
                        {
                            var newField = field + "_Avg";
                            group.FinalResult.AddOrUpdateField(newField, group.Sums[field] / group.WholeGroup.Count);
                            tplSelectFields.Add(newField);
                        }
                    }
                }
            }

            var select = new TplSelect(tplSelectFields);

            return(select.Process(groupByResult.Select(g => g.FinalResult)));
        }