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); }
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))); }