| 128 | } |
| 129 | |
| 130 | func (jc *joinClause) copyColumnsTo(out *DataTable) error { |
| 131 | if out == nil { |
| 132 | return ErrNilOutputDatatable |
| 133 | } |
| 134 | |
| 135 | mon := make(map[string]bool, len(jc.on)) |
| 136 | for _, o := range jc.on { |
| 137 | mon[o] = true |
| 138 | } |
| 139 | |
| 140 | for _, col := range jc.table.cols { |
| 141 | name := col.name |
| 142 | cname := name |
| 143 | |
| 144 | if _, found := mon[name]; found { |
| 145 | if !jc.includeOnCols { |
| 146 | continue |
| 147 | } |
| 148 | } else if v, ok := jc.mcols[name]; ok && len(v) > 1 { |
| 149 | // commons col between table |
| 150 | for _, tn := range v { |
| 151 | if tn == jc.table.name { |
| 152 | cname = colname(jc.table, name) |
| 153 | break |
| 154 | } |
| 155 | } |
| 156 | } |
| 157 | |
| 158 | ccpy := col.emptyCopy() |
| 159 | ccpy.name = cname |
| 160 | if err := out.addColumn(ccpy); err != nil { |
| 161 | return err |
| 162 | } |
| 163 | |
| 164 | jc.cmapper = append(jc.cmapper, [2]string{name, cname}) |
| 165 | } |
| 166 | |
| 167 | return nil |
| 168 | } |
| 169 | |
| 170 | func (jc *joinClause) initHashTable() { |
| 171 | jc.hashtable = hasher.Table(jc.table, jc.on) |