Data Pipeline Patterns
Validation Summary
Validation can produce a compact summary instead of stopping at the first failure.
validation threshold
The threshold decides which records count as accepted.
summary record
A summary record returns both counts together without exposing mutable state.
Validation Summary
ValidationSummary.java
Replay: real traced execution (multi-file project)
public class ValidationSummary {
record Submission(String name, int score) {}
record Summary(int accepted, int rejected) {}
static Summary summarize(Submission[] submissions, int minimumScore) {
int accepted = 0;
int rejected = 0;
for (Submission submission : submissions) {
if (submission.score() >= minimumScore) {
accepted++;
} else {
rejected++;
}
}
return new Summary(accepted, rejected);
}
public static void main(String[] args) {
int minimumScore = 70;
Submission[] submissions = {
new Submission("alpha", 95),
new Submission("beta", 68),
new Submission("gamma", 82)
};
Summary summary = summarize(submissions, minimumScore);
System.out.println("accepted=" + summary.accepted());
System.out.println("rejected=" + summary.rejected());
}
}
public class ValidationSummary {
record Submission(String name, int score) {}
record Summary(int accepted, int rejected) {}
static Summary summarize(Submission[] submissions, int minimumScore) {
int accepted = 0;
int rejected = 0;
for (Submission submission : submissions) {
if (submission.score() >= minimumScore) {
accepted++;
} else {
rejected++;
}
}
return new Summary(accepted, rejected);
}
public static void main(String[] args) {
int minimumScore = 80;
Submission[] submissions = {
new Submission("alpha", 95),
new Submission("beta", 68),
new Submission("gamma", 82)
};
Summary summary = summarize(submissions, minimumScore);
System.out.println("accepted=" + summary.accepted());
System.out.println("rejected=" + summary.rejected());
}
}
public class ValidationSummary {
record Submission(String name, int score) {}
record Summary(int accepted, int rejected) {}
static Summary summarize(Submission[] submissions, int minimumScore) {
int accepted = 0;
int rejected = 0;
for (Submission submission : submissions) {
if (submission.score() >= minimumScore) {
accepted++;
} else {
rejected++;
}
}
return new Summary(accepted, rejected);
}
public static void main(String[] args) {
int minimumScore = 90;
Submission[] submissions = {
new Submission("alpha", 95),
new Submission("beta", 68),
new Submission("gamma", 82)
};
Summary summary = summarize(submissions, minimumScore);
System.out.println("accepted=" + summary.accepted());
System.out.println("rejected=" + summary.rejected());
}
}
minimumScore ← 70
20public static void main(String[] args) {21 int minimumScore→ 70 = 70; //@minimumScore=80, 9022 Submission[] submissions = {23 new Submission("alpha", 95),24 new Submission("beta", 68),25 new Submission("gamma", 82)26 };27 Summary summary = summarize(submissions, minimumScore70);accepted ← 0, rejected ← 0
5static Summary summarize(Submission[] submissions, int minimumScore70) {6 int accepted→ 0 = 0;7 int rejected→ 0 = 0;for (Submission submission : submissions)
pass 1 of 39for (Submission submissionSubmission[name=alpha, score=95] : submissions) {10 if (submission.score() >= minimumScore) {All 3 passes — pass 1 is the card above pass submissionminimumScoreacceptedrejected1 Submission[name=alpha, score=95] 70 0 → 1 — 2 Submission[name=beta, score=68] — — 0 → 1 3 Submission[name=gamma, score=82] 70 1 → 2 — accepted ← 1
pass 1 of 29for (Submission submission : submissions) {10 if (submission.score() >= minimumScore70) {11 accepted→ 1++;12 } else {rejected ← 1
11 accepted++;12} else {13 rejected→ 1++;14}accepted ← 2
pass 2 of 29for (Submission submission : submissions) {10 if (submission.score() >= minimumScore70) {11 accepted→ 2++;12 } else {return new Summary(accepted, rejected);
17 return new Summary(accepted, rejected);18}summary ← Summary[accepted=2, rejected=1]
26 };27 Summary summary→ Summary[accepted=2, rejected=1] = summarize(submissions, minimumScore70);2829 System.out.println("accepted=" + summary.accepted());30 System.out.println("rejected=" + summary.rejected());31}outputaccepted=2 rejected=1
minimumScore ← 80
20public static void main(String[] args) {21 int minimumScore→ 80 = 80;22 Submission[] submissions = {23 new Submission("alpha", 95),24 new Submission("beta", 68),25 new Submission("gamma", 82)26 };27 Summary summary = summarize(submissions, minimumScore80);accepted ← 0, rejected ← 0
5static Summary summarize(Submission[] submissions, int minimumScore80) {6 int accepted→ 0 = 0;7 int rejected→ 0 = 0;for (Submission submission : submissions)
pass 1 of 39for (Submission submissionSubmission[name=alpha, score=95] : submissions) {10 if (submission.score() >= minimumScore) {All 3 passes — pass 1 is the card above pass submissionminimumScoreacceptedrejected1 Submission[name=alpha, score=95] 80 0 → 1 — 2 Submission[name=beta, score=68] — — 0 → 1 3 Submission[name=gamma, score=82] 80 1 → 2 — accepted ← 1
pass 1 of 29for (Submission submission : submissions) {10 if (submission.score() >= minimumScore80) {11 accepted→ 1++;12 } else {rejected ← 1
11 accepted++;12} else {13 rejected→ 1++;14}accepted ← 2
pass 2 of 29for (Submission submission : submissions) {10 if (submission.score() >= minimumScore80) {11 accepted→ 2++;12 } else {return new Summary(accepted, rejected);
17 return new Summary(accepted, rejected);18}summary ← Summary[accepted=2, rejected=1]
26 };27 Summary summary→ Summary[accepted=2, rejected=1] = summarize(submissions, minimumScore80);2829 System.out.println("accepted=" + summary.accepted());30 System.out.println("rejected=" + summary.rejected());31}outputaccepted=2 rejected=1
minimumScore ← 90
20public static void main(String[] args) {21 int minimumScore→ 90 = 90;22 Submission[] submissions = {23 new Submission("alpha", 95),24 new Submission("beta", 68),25 new Submission("gamma", 82)26 };27 Summary summary = summarize(submissions, minimumScore90);accepted ← 0, rejected ← 0
5static Summary summarize(Submission[] submissions, int minimumScore90) {6 int accepted→ 0 = 0;7 int rejected→ 0 = 0;for (Submission submission : submissions)
pass 1 of 39for (Submission submissionSubmission[name=alpha, score=95] : submissions) {10 if (submission.score() >= minimumScore) {All 3 passes — pass 1 is the card above pass submissionminimumScoreacceptedrejected1 Submission[name=alpha, score=95] 90 0 → 1 — 2 Submission[name=beta, score=68] — — 0 → 1 3 Submission[name=gamma, score=82] — — 1 → 2 accepted ← 1
9for (Submission submission : submissions) {10 if (submission.score() >= minimumScore90) {11 accepted→ 1++;12 } else {rejected ← 1
pass 1 of 211 accepted++;12} else {13 rejected→ 1++;14}rejected ← 2
pass 2 of 211 accepted++;12} else {13 rejected→ 2++;14}return new Summary(accepted, rejected);
17 return new Summary(accepted, rejected);18}summary ← Summary[accepted=1, rejected=2]
26 };27 Summary summary→ Summary[accepted=1, rejected=2] = summarize(submissions, minimumScore90);2829 System.out.println("accepted=" + summary.accepted());30 System.out.println("rejected=" + summary.rejected());31}outputaccepted=1 rejected=2