package parts

import (
	

	
	

	
	
)

// arrow implments the Part interface backed by an Arrow record.
type arrowPart struct {
	basePart

	schema *dynparquet.Schema
	record arrow.Record
	size   uint64
}

// NewArrowPart returns a new Arrow part.
func ( uint64,  arrow.Record,  uint64,  *dynparquet.Schema,  ...Option) Part {
	 := &arrowPart{
		basePart: basePart{
			tx: ,
		},
		schema: ,
		record: ,
		size:   ,
	}

	for ,  := range  {
		(&.basePart)
	}

	return 
}

func ( *arrowPart) ( io.Writer) error {
	 := ipc.NewWriter(
		,
		ipc.WithSchema(.record.Schema()),
	)
	defer .Close()
	return .Write(.record)
}

func ( *arrowPart) () { .record.Retain() }

func ( *arrowPart) () arrow.Record {
	return .record
}

func ( *arrowPart) () { .record.Release() }

func ( *arrowPart) ( *dynparquet.Schema,  dynparquet.ParquetWriter) error {
	return pqarrow.RecordToFile(, , .record)
}

func ( *arrowPart) ( *dynparquet.Schema) (*dynparquet.SerializedBuffer, error) {
	return pqarrow.SerializeRecord(.record, )
}

func ( *arrowPart) () int64 {
	return .record.NumRows()
}

func ( *arrowPart) () int64 {
	return int64(.size)
}

// Least returns the least row  in the part.
func ( *arrowPart) () (*dynparquet.DynamicRow, error) {
	if .minRow != nil {
		return .minRow, nil
	}

	 := pqarrow.RecordDynamicCols(.record)
	,  := .schema.GetDynamicParquetSchema()
	if  != nil {
		return nil, 
	}
	defer .schema.PutPooledParquetSchema()
	.minRow,  = pqarrow.RecordToDynamicRow(.Schema, .record, , 0)
	if  != nil {
		return nil, 
	}

	return .minRow, nil
}

func ( *arrowPart) () (*dynparquet.DynamicRow, error) {
	if .maxRow != nil {
		return .maxRow, nil
	}

	 := pqarrow.RecordDynamicCols(.record)
	,  := .schema.GetDynamicParquetSchema()
	if  != nil {
		return nil, 
	}
	defer .schema.PutPooledParquetSchema()
	.maxRow,  = pqarrow.RecordToDynamicRow(.Schema, .record, , int(.record.NumRows()-1))
	if  != nil {
		return nil, 
	}

	return .maxRow, nil
}

func ( *arrowPart) ( *dynparquet.Schema,  Part) (bool, error) {
	,  := .Least()
	if  != nil {
		return false, 
	}
	,  := .Most()
	if  != nil {
		return false, 
	}
	,  := .Least()
	if  != nil {
		return false, 
	}
	,  := .Most()
	if  != nil {
		return false, 
	}

	return .Cmp(, ) <= 0 && .Cmp(, ) <= 0, nil
}