Skip to content

NikhilNamal17 bundled source: 9 same-quote/source rows collide on differing year metadata #147

Description

@DutchJaFO

What was found

While verifying #64 (conflict resolution policy) live, NikhilNamal17_popular-movie-quotes.json was found to contain 9 pairs of rows that collide to the same quote id, detected via the new System_ImportConflicts logging (a duplicate whose firstSeenInFile and conflictFile were both NikhilNamal17_popular-movie-quotes.json — i.e. an internal duplicate within the same bundled file, not a cross-file one).

Root cause: QuoteIdentity.StableId(quote, source) (src/Quotinator.Core/Import/QuoteIdentity.cs) derives the id from SHA-256(normalize(quote) + "|" + normalize(source)) only — deliberately excluding date/year, and case-insensitive via Normalise. This is correct, frozen, documented behaviour (ported from the historical scripts/seed.csx) — not a bug. The 9 collisions happen because the raw upstream NikhilNamal17/popular-movie-quotes dataset itself has the same quote attributed to the same movie twice, with only the year differing (or, in one case, only the movie title's letter case differing):

Quote (truncated) Source Date A Date B
"Life is a banquet, and most poor suckers are starving to death!" Auntie Mame 1958 2005
"Even the smallest person can change the course of the future." The Lord of the Rings: The Fellowship of the Ring 2001 2002
"Spider-Pig, Spider-Pig...” The Simpsons movie / The Simpsons Movie (case differs) 2007 2019
"It's not about what I want. It's about what's fair!" The Dark Knight 2008 2008 (identical row)
"Some men just want to watch the world burn." The Dark Knight 2008 2008 (identical row)
"Following's not really my style." Marvel's The Avengers 2012 2019
"I have nothing to prove to you" Captain Marvel 2013 2019
"Life's a little bit messy..." Zootopia 2016 2016 (identical row)
"If you want to get crazy. We can get crazy." Us 2019 2019 (identical row)

Since these collide to the same id, the seeder's first-occurrence-wins (or configured conflict policy) behaviour silently keeps only one of the two — this has always happened silently; #64's new conflict logging is what made it visible for the first time.

Why Data Enrichment

This is upstream data quality in a bundled source, not a code bug — it belongs with other data-quality/enrichment work rather than the Data Import & Sources pipeline milestone.

Possible directions (not decided here)

  • Leave as-is — the collision resolves deterministically and doesn't corrupt data, just silently drops one of two near-duplicate rows.
  • Manually review the 9 pairs and decide which year is correct, updating the raw upstream reference or a local override.
  • If this pattern recurs across future upstream refreshes, consider whether the identity scheme should ever be revisited — though QuoteIdentity.StableId is documented as frozen and must not change casually, since altering it would silently duplicate or orphan existing database rows on next refresh.

No action taken in this issue yet — filed for tracking and future decision.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions