Files
Joe ElliottandGitHub 90be636dde Update parquet go (#4654)
* update parquet-go

Signed-off-by: Joe Elliott <[email protected]>

* tolerate io.EOF in the wal iterator and find trace by id

Signed-off-by: Joe Elliott <[email protected]>

* add io.EOF check in test

Signed-off-by: Joe Elliott <[email protected]>

* add missing parquet file

Signed-off-by: Joe Elliott <[email protected]>

* update to latest

Signed-off-by: Joe Elliott <[email protected]>

* update again

Signed-off-by: Joe Elliott <[email protected]>

* that was kind of a good catch, linter ... but dont let it go to your head

Signed-off-by: Joe Elliott <[email protected]>

---------

Signed-off-by: Joe Elliott <[email protected]>
2025-02-04 07:56:47 -05:00

108 lines
2.6 KiB
Go

package parquet
// DedupeRowReader constructs a row reader which drops duplicated consecutive
// rows, according to the comparator function passed as argument.
//
// If the underlying reader produces a sequence of rows sorted by the same
// comparison predicate, the output is guaranteed to produce unique rows only.
func DedupeRowReader(reader RowReader, compare func(Row, Row) int) RowReader {
return &dedupeRowReader{reader: reader, compare: compare}
}
type dedupeRowReader struct {
reader RowReader
compare func(Row, Row) int
dedupe
}
func (d *dedupeRowReader) ReadRows(rows []Row) (int, error) {
for {
n, err := d.reader.ReadRows(rows)
n = d.deduplicate(rows[:n], d.compare)
if n > 0 || err != nil {
return n, err
}
}
}
// DedupeRowWriter constructs a row writer which drops duplicated consecutive
// rows, according to the comparator function passed as argument.
//
// If the writer is given a sequence of rows sorted by the same comparison
// predicate, the output is guaranteed to contain unique rows only.
func DedupeRowWriter(writer RowWriter, compare func(Row, Row) int) RowWriter {
return &dedupeRowWriter{writer: writer, compare: compare}
}
type dedupeRowWriter struct {
writer RowWriter
compare func(Row, Row) int
dedupe
rows []Row
}
func (d *dedupeRowWriter) WriteRows(rows []Row) (int, error) {
// We need to make a copy because we cannot modify the rows slice received
// as argument to respect the RowWriter contract.
d.rows = append(d.rows[:0], rows...)
defer func() {
for i := range d.rows {
d.rows[i] = Row{}
}
}()
if n := d.deduplicate(d.rows, d.compare); n > 0 {
w, err := d.writer.WriteRows(d.rows[:n])
if err != nil {
return w, err
}
}
// Return the number of rows received instead of the number of deduplicated
// rows actually written to the underlying writer because we have to repsect
// the RowWriter contract.
return len(rows), nil
}
type dedupe struct {
lastRow Row
uniq []Row
dupe []Row
}
func (d *dedupe) reset() {
d.lastRow = d.lastRow[:0]
}
func (d *dedupe) deduplicate(rows []Row, compare func(Row, Row) int) int {
defer func() {
for i := range d.uniq {
d.uniq[i] = Row{}
}
for i := range d.dupe {
d.dupe[i] = Row{}
}
d.uniq = d.uniq[:0]
d.dupe = d.dupe[:0]
}()
lastRow := d.lastRow
for _, row := range rows {
if len(lastRow) != 0 && compare(row, lastRow) == 0 {
d.dupe = append(d.dupe, row)
} else {
lastRow = row
d.uniq = append(d.uniq, row)
}
}
rows = rows[:0]
rows = append(rows, d.uniq...)
rows = append(rows, d.dupe...)
d.lastRow = append(d.lastRow[:0], lastRow...)
return len(d.uniq)
}