@@ -138,22 +138,30 @@ function populate!(A, table, value::Symbol; force=false)
138138 # Use a BitArray mask to detect duplicates and error instead of overwriting.
139139 mask = force ? falses () : falses (size (A))
140140
141- for r in Tables. rows (table)
142- vals = Tuple (Tables. getcolumn (r, c) for c in dimnames (A))
143- inds = map (findindex, vals, axiskeys (A))
141+ cols = Tables. columns (table)
142+ value_column = Tables. getcolumn (cols, value)
143+ axis_key_columns = Tuple (Tables. getcolumn (cols, c) for c in dimnames (A))
144+ return populate_function_barrier! (A, value_column, axis_key_columns, mask, force)
145+ end
146+
147+ # eltypes of value and axis_key_columns aren't inferable in `populate!` if the `table`
148+ # doesn't have typed columns, as is the case for DataFrames. By passing them into
149+ # `populate_function_barrier!` once they've been pulled out of a DataFrame ensures
150+ # inference is possible for the loop.
151+ function populate_function_barrier! (A, value_column, axis_key_columns, mask, force)
152+ for (val, keys... ) in zip (value_column, axis_key_columns... )
153+ inds = map (AxisKeys. findindex, keys, axiskeys (A))
144154
145155 # Handle duplicate error checking if applicable
146156 if ! force
147157 # Error if mask already set.
148- mask[inds... ] && throw (ArgumentError (" Key $vals is not unique" ))
158+ mask[inds... ] && throw (ArgumentError (" Key $keys is not unique" ))
149159 # Set mask, marking that we've set this index
150160 setindex! (mask, true , inds... )
151161 end
152162
153- # Insert our value into the data array
154- setindex! (A, Tables. getcolumn (r, value), inds... )
163+ setindex! (A, val, inds... )
155164 end
156-
157165 return A
158166end
159167
0 commit comments