github.com/mithrandie/csvq@v1.18.1/lib/query/record.go (about)

     1  package query
     2  
     3  import (
     4  	"sync"
     5  
     6  	"github.com/mithrandie/csvq/lib/value"
     7  )
     8  
     9  type Cell []value.Primary
    10  
    11  func NewCell(val value.Primary) Cell {
    12  	return []value.Primary{val}
    13  }
    14  
    15  func NewGroupCell(values []value.Primary) Cell {
    16  	return values
    17  }
    18  
    19  type RecordSet []Record
    20  
    21  func (r RecordSet) Copy() RecordSet {
    22  	records := make(RecordSet, len(r))
    23  	for i, v := range r {
    24  		records[i] = v.Copy()
    25  	}
    26  	return records
    27  }
    28  
    29  func (r RecordSet) Merge(r2 RecordSet) RecordSet {
    30  	var recordSet = make(RecordSet, len(r)+len(r2))
    31  	leftLen := len(r)
    32  	for i := range r {
    33  		recordSet[i] = r[i]
    34  	}
    35  	for i := range r2 {
    36  		recordSet[i+leftLen] = r2[i]
    37  	}
    38  	return recordSet
    39  }
    40  
    41  type Record []Cell
    42  
    43  func NewRecordWithId(internalId int, values []value.Primary) Record {
    44  	record := make(Record, len(values)+1)
    45  
    46  	record[0] = NewCell(value.NewInteger(int64(internalId)))
    47  
    48  	for i, v := range values {
    49  		record[i+1] = NewCell(v)
    50  	}
    51  
    52  	return record
    53  }
    54  
    55  func NewRecord(values []value.Primary) Record {
    56  	record := make(Record, len(values))
    57  
    58  	for i, v := range values {
    59  		if v == nil {
    60  			record[i] = []value.Primary{}
    61  		} else {
    62  			record[i] = NewCell(v)
    63  		}
    64  	}
    65  
    66  	return record
    67  }
    68  
    69  func NewEmptyRecord(len int) Record {
    70  	record := make(Record, len, len+2)
    71  	for i := 0; i < len; i++ {
    72  		record[i] = NewCell(value.NewNull())
    73  	}
    74  
    75  	return record
    76  }
    77  
    78  func (r Record) GroupLen() int {
    79  	return len(r[0])
    80  }
    81  
    82  func (r Record) Copy() Record {
    83  	record := make(Record, len(r))
    84  	for i := range r {
    85  		record[i] = r[i]
    86  	}
    87  	return record
    88  }
    89  
    90  func (r Record) Merge(r2 Record, pool *sync.Pool) Record {
    91  	var record Record
    92  	if pool != nil {
    93  		record = pool.Get().(Record)
    94  	} else {
    95  		record = make(Record, len(r)+len(r2))
    96  	}
    97  	leftLen := len(r)
    98  	for i := range r {
    99  		record[i] = r[i]
   100  	}
   101  	for i := range r2 {
   102  		record[i+leftLen] = r2[i]
   103  	}
   104  	return record
   105  }
   106  
   107  func MergeRecordSetList(list []RecordSet) RecordSet {
   108  	var records RecordSet
   109  	if len(list) == 2 && len(list[1]) == 0 {
   110  		records = list[0]
   111  	} else {
   112  		recordLen := 0
   113  		for _, v := range list {
   114  			recordLen += len(v)
   115  		}
   116  		records = make(RecordSet, recordLen)
   117  		idx := 0
   118  		for _, rset := range list {
   119  			for _, r := range rset {
   120  				records[idx] = r
   121  				idx++
   122  			}
   123  		}
   124  	}
   125  	return records
   126  }