If the Range is moved to the outer block, then it's computed once per partition rather than once per row.
(though maybe compiler magic alleviates it)

Would it also be cleaner - for the implementation and API - if the row object had a:
``
  def toSeq = {
    oi.getAllStructFieldRefs.map { structField =>
      val primitiveData = oi.getStructFieldData(rawdata, structField)
      structField.getFieldObjectInspector.asInstanceOf[PrimitiveObjectInspector].
        getPrimitiveJavaObject(primitiveData)
    }
  }
```

+ maybe a toTuple