作者:scritchle
项目:or
// NewStringTreeReader returns a StringTreeReader implementation along with any error that occurs.s
func NewStringTreeReader(present, data, length, dictionary io.Reader, encoding *proto.ColumnEncoding) (StringTreeReader, error) {
switch kind := encoding.GetKind(); kind {
case proto.ColumnEncoding_DIRECT, proto.ColumnEncoding_DIRECT_V2:
return NewStringDirectTreeReader(present, data, length, kind)
case proto.ColumnEncoding_DICTIONARY, proto.ColumnEncoding_DICTIONARY_V2:
return NewStringDictionaryTreeReader(present, data, length, dictionary, encoding)
}
return nil, fmt.Errorf("unsupported column encoding: %s", encoding.GetKind())
}
作者:scritchle
项目:or
// NewIntegerTreeReader returns a new IntegerReader or an error if one occurs.
func NewIntegerTreeReader(present, data io.Reader, encoding *proto.ColumnEncoding) (*IntegerTreeReader, error) {
ireader, err := createIntegerReader(encoding.GetKind(), data, true, false)
if err != nil {
return nil, err
}
return &IntegerTreeReader{
NewBaseTreeReader(present),
ireader,
}, nil
}
作者:scritchle
项目:or
func NewBinaryTreeReader(present, data, length io.Reader, encoding *proto.ColumnEncoding) (*BinaryTreeReader, error) {
lengthReader, err := createIntegerReader(encoding.GetKind(), length, false, false)
if err != nil {
return nil, err
}
return &BinaryTreeReader{
BaseTreeReader: NewBaseTreeReader(present),
length: lengthReader,
data: data,
}, nil
}
作者:scritchle
项目:or
func NewListTreeReader(present, length io.Reader, value TreeReader, encoding *proto.ColumnEncoding) (*ListTreeReader, error) {
lengthReader, err := createIntegerReader(encoding.GetKind(), length, false, false)
if err != nil {
return nil, err
}
return &ListTreeReader{
BaseTreeReader: NewBaseTreeReader(present),
length: lengthReader,
value: value,
}, nil
}
作者:scritchle
项目:or
// NewDecimalTreeReader returns a new instances of a DecimalTreeReader or an error if one occurs.
func NewDecimalTreeReader(present, data, secondary io.Reader, encoding *proto.ColumnEncoding, precision, scale int) (*DecimalTreeReader, error) {
ireader, err := createIntegerReader(encoding.GetKind(), secondary, true, false)
if err != nil {
return nil, err
}
return &DecimalTreeReader{
BaseTreeReader: NewBaseTreeReader(present),
data: bufio.NewReader(data),
secondary: ireader,
precision: precision,
scale: scale,
}, nil
}
作者:scritchle
项目:or
// NewTimestampTreeReader returns a new TimestampTreeReader along with any error that occurs.
func NewTimestampTreeReader(present, data, secondary io.Reader, encoding *proto.ColumnEncoding) (*TimestampTreeReader, error) {
dataReader, err := createIntegerReader(encoding.GetKind(), data, true, false)
if err != nil {
return nil, err
}
secondaryReader, err := createIntegerReader(encoding.GetKind(), secondary, true, false)
if err != nil {
return nil, err
}
return &TimestampTreeReader{
BaseTreeReader: NewBaseTreeReader(present),
data: dataReader,
secondary: secondaryReader,
}, nil
}
作者:scritchle
项目:or
func (s *StringDictionaryTreeReader) readDictionaryLength(length io.Reader, encoding *proto.ColumnEncoding) error {
lreader, err := createIntegerReader(encoding.GetKind(), length, false, false)
if err != nil {
return err
}
var offset int
for lreader.Next() {
l := int(lreader.Int())
s.dictionaryLength = append(s.dictionaryLength, l)
s.dictionaryOffsets = append(s.dictionaryOffsets, offset)
offset += l
}
if err := lreader.Err(); err != nil && err != io.EOF {
return err
}
return nil
}
作者:scritchle
项目:or
func NewStringDictionaryTreeReader(present, data, length, dictionary io.Reader, encoding *proto.ColumnEncoding) (*StringDictionaryTreeReader, error) {
ireader, err := createIntegerReader(encoding.GetKind(), data, false, false)
if err != nil {
return nil, err
}
r := &StringDictionaryTreeReader{
BaseTreeReader: NewBaseTreeReader(present),
reader: ireader,
}
if dictionary != nil && encoding != nil {
err := r.readDictionaryStream(dictionary)
if err != nil {
return nil, err
}
if length != nil {
err = r.readDictionaryLength(length, encoding)
if err != nil {
return nil, err
}
}
}
return r, nil
}