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

View File

@ -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,
}