Github user cloud-fan commented on a diff in the pull request:
https://github.com/apache/spark/pull/19811#discussion_r156930403
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala
---
@@ -163,11 +192,49 @@ class CodegenContext {
* the list of default imports available.
* Also, generic type arguments are accepted but ignored.
* @param variableName Name of the field.
- * @param initCode The statement(s) to put into the init() method to
initialize this field.
+ * @param initFunc Function includes statement(s) to put into the init()
method to initialize
+ * this field. The argument is the name of the mutable
state variable.
* If left blank, the field will be default-initialized.
+ * @param forceInline whether the declaration and initialization code
may be inlined rather than
+ * compacted. Please set `true` into forceInline, if
you want to access the
+ * status fast (e.g. frequently accessed) or if you
want to use the original
+ * variable name
+ * @param useFreshName If false and inline is true, the name is not
changed
+ * @return the name of the mutable state variable, which is either the
original name if the
+ * variable is inlined to the outer class, or an array access if
the variable is to be
+ * stored in an array of variables of the same type and
initialization.
+ * There are two use cases. One is to use the original name for
global variable instead
+ * of fresh name. Second is to use the original initialization
statement since it is
+ * complex (e.g. allocate multi-dimensional array or object
constructor has varibles).
+ * Primitive type variables will be inlined into outer class
when the total number of
+ * mutable variables is less than
`CodeGenerator.OUTER_CLASS_VARIABLES_THRESHOLD`
+ * the max size of an array for compaction is given by
+ * `CodeGenerator.MUTABLESTATEARRAY_SIZE_LIMIT`.
*/
- def addMutableState(javaType: String, variableName: String, initCode:
String = ""): Unit = {
- mutableStates += ((javaType, variableName, initCode))
+ def addMutableState(
+ javaType: String,
+ variableName: String,
+ initFunc: String => String = _ => "",
+ forceInline: Boolean = false,
+ useFreshName: Boolean = true): String = {
+ val varName = if (useFreshName) freshName(variableName) else
variableName
--- End diff --
instead of calling `freshName` here and adding a `useFreshName` parameter,
can we follow the previous style and ask the caller side to guarantee the given
name is unique? i.e. call `freshName` at caller side
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]