How are these four parameters used and associated in the snmp4j ?

At first, I thought that when using the tableUtils.getTable method, we needed to set maxNumColumnsPerPDU and maxNumRowsPerPDU. If using snmp. send (pdu, target) to simulate the walk method, then maxRepetitions and nonRepeaters need to be set. But when I checked the source code of snmp4j, I found that it’s not like that. Actually, maxNumOfRowsPerPDU has maxRepetitions set at the bottom level. What I’m puzzled about is that I can’t understand the logic of maxNumColumnsPerPDU? Isn’t it about the number of columns in each PDU? How does it compare to pdu.size here?
int sz = Math.min(this.lastReceived.size() - this.sent, TableUtils.this.maxNumColumnsPerPDU);
if (pdu.getType() == -91) {
if (TableUtils.this.maxNumOfRowsPerPDU > 0) {
pdu.setMaxRepetitions(TableUtils.this.maxNumOfRowsPerPDU);
pdu.setNonRepeaters(0);
} else {
pdu.setNonRepeaters(sz);
pdu.setMaxRepetitions(0);
}
}
if (pdu.size() >= TableUtils.this.maxNumColumnsPerPDU) {
pdu = this.sendGetPDU(firstCacheRow, responseListener, pdu);
}