Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 20 additions & 5 deletions Sources/table/Table.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,20 @@ class ParsedTable: Table {
}
}

func skipTechnicalParts(row: inout String?) -> Bool {
let skip = ParsedTable.technicalPart(type: conf.type, str: row)
for _ in 0..<skip {
row = nextLine()
}
return skip > 0
}

func next() throws -> Row? {
line += 1

var row = nextLine()

while ParsedTable.technicalRow(row) {
row = reader.readLine()
}
while skipTechnicalParts(row: &row) {}

return try! row.map { row in
let components = try ParsedTable.readRowComponents(row, type: conf.type, delimeter: conf.delimeter, trim: conf.trim)
Expand Down Expand Up @@ -214,8 +220,17 @@ class ParsedTable: Table {
return components
}

// matches rows that has to be skipped, usually horizontal delimeters
// matches rows that has to be skipped, usually horizontal delimeters
private static func technicalRow(_ str: String?) -> Bool {
return str?.matches(ParsedTable.technicalRowPattern) ?? false
return str?.trimmingCharacters(in: .whitespaces).isEmpty ?? false || str?.matches(ParsedTable.technicalRowPattern) ?? false
}

// extended version that can skip multiple technical rows based on file type, used inside of the file parsing loop
private static func technicalPart(type: FileType, str: String?) -> Int {
if (type == .cassandraSql && "---MORE---" == str) {
// more + header + a line
return 3;
}
return technicalRow(str) ? 1 : 0;
}
}
31 changes: 31 additions & 0 deletions Tests/table-Tests/TableParserTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,37 @@ class TableParserTests: XCTestCase {
XCTAssertEqual(row.components[2].value, "3")
}

func testParseCassandraMoreCursor() throws {

let table = try ParsedTable.parse(reader: ArrayLineReader(lines: [
" id | name",
"----+------",
" 1 | name1",
" 2 | name2",
" 3 | name3",
" 4 | name4",
" 5 | name5",
"",
"---MORE---",
" id | name",
"----+-------",
" 6 | name6",
" 7 | name7",
" 8 | name8",
" 9 | name9",
" 10 | name10"
]), hasHeader: nil, headerOverride: nil, delimeter: "|")

XCTAssertEqual(table.header.components()[0], "id")
XCTAssertEqual(table.header.components()[1], "name")

for i in 1...10 {
let row = try table.next()!
XCTAssertEqual(row.components[0].value, "\(i)")
XCTAssertEqual(row.components[1].value, "name\(i)")
}
}

func testQuotedFieldsWithCommas() throws {
let table = try ParsedTable.parse(reader: ArrayLineReader(lines: [
"\"Name,Full\",Age,City",
Expand Down
16 changes: 16 additions & 0 deletions test-data/cassandra_more.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
id | name
----+------
1 | name1
2 | name2
3 | name3
4 | name4
5 | name5

---MORE---
id | name
----+-------
6 | name6
7 | name7
8 | name8
9 | name9
10 | name10