From 99c5930b31fede13bbe7a30ed3b22f1f5fb92de2 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Sat, 8 Aug 2020 09:37:02 -0400 Subject: [PATCH] Add an equal merging strategy --- app/db/src/app/common/bible-reference.spec.ts | 25 ++++++++++++------- app/db/src/app/common/bible-reference.ts | 10 +++++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/db/src/app/common/bible-reference.spec.ts b/app/db/src/app/common/bible-reference.spec.ts index aa5f78d1..2f60b76a 100644 --- a/app/db/src/app/common/bible-reference.spec.ts +++ b/app/db/src/app/common/bible-reference.spec.ts @@ -338,10 +338,11 @@ describe('Reference Overlap Detection', () => { const leftRef = new BibleReference('Gen 1:1-10'); const rightRef = new BibleReference('Gen 1:1-10'); - expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Equal); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Equal)).toEqual(new BibleReference('Gen 1:1-10')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-10')); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); it('Detects Right embedded in Left', () => { @@ -349,8 +350,9 @@ describe('Reference Overlap Detection', () => { const rightRef = new BibleReference('Gen 1:2-8'); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Equal)).toBeNull(); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); @@ -359,8 +361,9 @@ describe('Reference Overlap Detection', () => { const rightRef = new BibleReference('Gen 2:1-10'); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Intersect); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-2:10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Equal)).toBeNull(); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-2:10')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); @@ -369,8 +372,9 @@ describe('Reference Overlap Detection', () => { const rightRef = new BibleReference('Gen 1:1-2:5'); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Intersect); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-2:10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Equal)).toBeNull(); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-2:10')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); @@ -379,8 +383,9 @@ describe('Reference Overlap Detection', () => { const rightRef = new BibleReference('Gen 1:1-2:5'); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.None); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Equal)).toBeNull(); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toBeNull(); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); @@ -389,10 +394,11 @@ describe('Reference Overlap Detection', () => { const rightRef = new BibleReference('Gen 1:1-3:1'); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Equal)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-3:1')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect).toString()).toEqual( new BibleReference('Gen 1:1-3:1').toString() ); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-3:1')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); @@ -401,10 +407,11 @@ describe('Reference Overlap Detection', () => { const rightRef = new BibleReference('Gen 1:1-2:5'); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Equal)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-3:1')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect).toString()).toEqual( new BibleReference('Gen 1:1-3:1').toString() ); - expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-3:1')); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); }); diff --git a/app/db/src/app/common/bible-reference.ts b/app/db/src/app/common/bible-reference.ts index 412edae2..03f84250 100644 --- a/app/db/src/app/common/bible-reference.ts +++ b/app/db/src/app/common/bible-reference.ts @@ -1920,6 +1920,10 @@ export class BibleReference { let rightStartIndex = rightRef.startIndex(); let rightEndIndex = rightRef.endIndex(); + // Both references are equal to each other + if (leftStartIndex === rightStartIndex && leftEndIndex === rightEndIndex) { + return Overlap.Equal; + } if ( // left is subset of right (leftStartIndex >= rightStartIndex && leftEndIndex <= rightEndIndex) || @@ -1944,7 +1948,10 @@ export class BibleReference { ref2: BibleReference, strategy: Overlap ): BibleReference | null { - if (ref1.toString() === ref2.toString()) { + if (strategy === Overlap.None) { + return null; + } + if (ref1.toString() === ref2.toString() && strategy === Overlap.Equal) { return ref1; } let overlapType = BibleReference.overlap(ref1, ref2); @@ -2199,6 +2206,7 @@ class StringUtils { export enum Overlap { Intersect, Subset, + Equal, None, }