github.com/parquet-go/parquet-go@v0.21.1-0.20240501160520-b3c3a0c3ed6f/compress/brotli/brotli.go (about)

     1  // Package brotli implements the BROTLI parquet compression codec.
     2  package brotli
     3  
     4  import (
     5  	"io"
     6  
     7  	"github.com/andybalholm/brotli"
     8  	"github.com/parquet-go/parquet-go/compress"
     9  	"github.com/parquet-go/parquet-go/format"
    10  )
    11  
    12  const (
    13  	DefaultQuality = 0
    14  	DefaultLGWin   = 0
    15  )
    16  
    17  type Codec struct {
    18  	// Quality controls the compression-speed vs compression-density trade-offs.
    19  	// The higher the quality, the slower the compression. Range is 0 to 11.
    20  	Quality int
    21  	// LGWin is the base 2 logarithm of the sliding window size.
    22  	// Range is 10 to 24. 0 indicates automatic configuration based on Quality.
    23  	LGWin int
    24  
    25  	r compress.Decompressor
    26  	w compress.Compressor
    27  }
    28  
    29  func (c *Codec) String() string {
    30  	return "BROTLI"
    31  }
    32  
    33  func (c *Codec) CompressionCodec() format.CompressionCodec {
    34  	return format.Brotli
    35  }
    36  
    37  func (c *Codec) Encode(dst, src []byte) ([]byte, error) {
    38  	return c.w.Encode(dst, src, func(w io.Writer) (compress.Writer, error) {
    39  		return brotli.NewWriterOptions(w, brotli.WriterOptions{
    40  			Quality: c.Quality,
    41  			LGWin:   c.LGWin,
    42  		}), nil
    43  	})
    44  }
    45  
    46  func (c *Codec) Decode(dst, src []byte) ([]byte, error) {
    47  	return c.r.Decode(dst, src, func(r io.Reader) (compress.Reader, error) {
    48  		return reader{brotli.NewReader(r)}, nil
    49  	})
    50  }
    51  
    52  type reader struct{ *brotli.Reader }
    53  
    54  func (reader) Close() error { return nil }