Skip to content

Commit 648c8d8

Browse files
SQLiteCloudRowset.slice to take negative arguments
1 parent 028497d commit 648c8d8

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

src/rowset.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,20 +104,15 @@ export class SQLiteCloudRowset extends Array<SQLiteCloudRow> {
104104

105105
/** Returns a subset of rows from this rowset */
106106
slice(start?: number, end?: number): SQLiteCloudRow[] {
107-
start = start && start > 0 ? start : 0
108-
if (end === undefined) {
109-
end = this.numberOfRows
110-
} else if (end < 0) {
111-
end = this.numberOfRows + end
112-
}
113-
if (end < start) {
114-
end = start
115-
} else if (end > this.numberOfRows) {
116-
end = this.numberOfRows
117-
}
107+
// validate and apply boundaries
108+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
109+
start = start === undefined ? 0 : start < 0 ? this.numberOfRows + start : start
110+
start = Math.min(Math.max(start, 0), this.numberOfRows)
111+
end = end === undefined ? this.numberOfRows : end < 0 ? this.numberOfRows + end : end
112+
end = Math.min(Math.max(start, end), this.numberOfRows)
118113

119-
const slicedData = this.#data.slice(start * this.numberOfColumns, end * this.numberOfColumns)
120114
const slicedMetadata = { ...this.#metadata, numberOfRows: end - start }
115+
const slicedData = this.#data.slice(start * this.numberOfColumns, end * this.numberOfColumns)
121116
return new SQLiteCloudRowset(slicedMetadata, slicedData)
122117
}
123118
}

test/rowset.test.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,32 @@ describe('rowset', () => {
4343
expect(Array.isArray(rowset)).toBeTruthy()
4444
expect(rowset).toHaveLength(50)
4545

46+
// slice with correct bounds
4647
const sliced = rowset.slice(10, 20)
4748
expect(sliced).toHaveLength(10)
4849
expect(sliced[0]).toMatchObject(rowset[10])
4950

50-
// slice more than actually exists!
51+
// slice with end larger than length
5152
const largerSlice = rowset.slice(10, 100)
5253
expect(largerSlice).toHaveLength(40)
5354
expect(largerSlice[0]).toMatchObject(rowset[10])
5455
expect(largerSlice[39]).toMatchObject(rowset[49])
5556

57+
// slice last 3 elements
58+
const negativeStartSlice = rowset.slice(-3)
59+
expect(negativeStartSlice).toHaveLength(3)
60+
expect(negativeStartSlice[0]).toMatchObject(rowset[rowset.length - 3])
61+
62+
// slice first 3 elements
63+
const negativeEndSlice = rowset.slice(0, -3)
64+
expect(negativeEndSlice).toHaveLength(rowset.length - 3)
65+
expect(negativeEndSlice[0]).toMatchObject(rowset[0])
66+
expect(negativeEndSlice[negativeEndSlice.length - 1]).toMatchObject(rowset[rowset.length - 4])
67+
68+
// slice to empty set
69+
const emptySlice = rowset.slice(20, 10)
70+
expect(emptySlice).toHaveLength(0)
71+
5672
connection.close()
5773
done()
5874
})

0 commit comments

Comments
 (0)