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 }