Add an equal merging strategy

This commit is contained in:
Jeremy Wall 2020-08-08 09:37:02 -04:00
parent 8ed0da3c1d
commit 99c5930b31
2 changed files with 25 additions and 10 deletions

View File

@ -338,10 +338,11 @@ describe('Reference Overlap Detection', () => {
const leftRef = new BibleReference('Gen 1:1-10'); const leftRef = new BibleReference('Gen 1:1-10');
const rightRef = new BibleReference('Gen 1:1-10'); const rightRef = new BibleReference('Gen 1:1-10');
expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Equal);
expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); 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.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', () => { it('Detects Right embedded in Left', () => {
@ -349,8 +350,9 @@ describe('Reference Overlap Detection', () => {
const rightRef = new BibleReference('Gen 1:2-8'); const rightRef = new BibleReference('Gen 1:2-8');
expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); 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.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(); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull();
}); });
@ -359,8 +361,9 @@ describe('Reference Overlap Detection', () => {
const rightRef = new BibleReference('Gen 2:1-10'); const rightRef = new BibleReference('Gen 2:1-10');
expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Intersect); 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.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(); 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'); const rightRef = new BibleReference('Gen 1:1-2:5');
expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Intersect); 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.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(); 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'); const rightRef = new BibleReference('Gen 1:1-2:5');
expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.None); 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.Subset)).toBeNull();
expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toBeNull();
expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).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'); const rightRef = new BibleReference('Gen 1:1-3:1');
expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); 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( expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect).toString()).toEqual(
new BibleReference('Gen 1:1-3:1').toString() 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(); 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'); const rightRef = new BibleReference('Gen 1:1-2:5');
expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); 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( expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect).toString()).toEqual(
new BibleReference('Gen 1:1-3:1').toString() 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(); expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull();
}); });
}); });

View File

@ -1920,6 +1920,10 @@ export class BibleReference {
let rightStartIndex = rightRef.startIndex(); let rightStartIndex = rightRef.startIndex();
let rightEndIndex = rightRef.endIndex(); let rightEndIndex = rightRef.endIndex();
// Both references are equal to each other
if (leftStartIndex === rightStartIndex && leftEndIndex === rightEndIndex) {
return Overlap.Equal;
}
if ( if (
// left is subset of right // left is subset of right
(leftStartIndex >= rightStartIndex && leftEndIndex <= rightEndIndex) || (leftStartIndex >= rightStartIndex && leftEndIndex <= rightEndIndex) ||
@ -1944,7 +1948,10 @@ export class BibleReference {
ref2: BibleReference, ref2: BibleReference,
strategy: Overlap strategy: Overlap
): BibleReference | null { ): BibleReference | null {
if (ref1.toString() === ref2.toString()) { if (strategy === Overlap.None) {
return null;
}
if (ref1.toString() === ref2.toString() && strategy === Overlap.Equal) {
return ref1; return ref1;
} }
let overlapType = BibleReference.overlap(ref1, ref2); let overlapType = BibleReference.overlap(ref1, ref2);
@ -2199,6 +2206,7 @@ class StringUtils {
export enum Overlap { export enum Overlap {
Intersect, Intersect,
Subset, Subset,
Equal,
None, None,
} }