func (u *Points) parseAndFilter(filename string, out io.Writer) (uint64, error) {
	var n uint64
	reader, err := RowBinary.NewReader(filename, u.reverse)
	if err != nil {
		return n, err
	}
	defer reader.Close()
	reader.SetZeroVersion(u.config.ZeroTimestamp)
	wb := RowBinary.GetWriteBuffer()
	defer wb.Release()
	for {
		name, err := reader.ReadRecord()
		if err != nil {  
			break
		}
		blacklisted := false
		if u.blacklist != nil && bytes.IndexByte(name, '?') == -1 {  
			blacklisted = u.blacklist.Contains(unsafeString(name), u.reverse)
		}
		if !blacklisted {
			wb.Reset()
			wb.WriteGraphitePoint(name, reader.Value(), reader.Timestamp(), reader.Version())
			_, err = out.Write(wb.Bytes())
			if err != nil {
				return n, err
			}
			n++
		}
	}
	return n, nil
}
parseAndFilter reads points data and excludes those ones which match blacklist
package uploader
import (
	"bufio"
	"bytes"
	"context"
	"fmt"
	"io"
	"go.uber.org/zap"
	"github.com/lomik/carbon-clickhouse/helper/RowBinary"
)
type Points struct {
	*Base
	blacklist *Blacklist
	reverse   bool
}
func NewPoints(base *Base, reverse bool) *Points {
	u := &Points{Base: base}
	u.Base.handler = u.upload
	u.reverse = reverse
	u.query = fmt.Sprintf("%s (Path, Value, Time, Date, Timestamp)", u.config.TableName)
	if len(u.config.IgnoredPatterns) > 0 {
		u.blacklist = NewBlacklist(u.config.IgnoredPatterns)
	}
	return u
}