if (childExpressions != null) {
super.evaluateChildren(batch);
}
BytesColumnVector inV1 = (BytesColumnVector) batch.cols[colNum1];
BytesColumnVector inV2 = (BytesColumnVector) batch.cols[colNum2];
BytesColumnVector outV = (BytesColumnVector) batch.cols[outputColumn];
int[] sel = batch.selected;
int n = batch.size;
byte[][] vector1 = inV1.vector;
byte[][] vector2 = inV2.vector;
int[] len1 = inV1.length;
int[] len2 = inV2.length;
int[] start1 = inV1.start;
int[] start2 = inV2.start;
// return immediately if batch is empty
if (n == 0) {
return;
}
// prepare output buffer to accept results
outV.initBuffer();
/* Handle default case for isRepeating setting for output. This will be set to true
* later in the special cases where that is necessary.
*/
outV.isRepeating = false;
if (inV1.noNulls && !inV2.noNulls) {
// propagate nulls
/* We'll assume that there *may* be nulls in the input if !noNulls is true
* for an input vector. This is to be more forgiving of errors in loading
* the vectors. A properly-written vectorized iterator will make sure that
* isNull[0] is set if !noNulls and isRepeating are true for the vector.
*/
outV.noNulls = false;
if (inV2.isRepeating) {
if (inV2.isNull[0]) {
// Output will also be repeating and null
outV.isNull[0] = true;
outV.isRepeating = true;
//return as no further processing is needed
return;
}
} else {
propagateNulls(batch.selectedInUse, n, sel, inV2, outV);
}
// perform data operation
if (inV1.isRepeating && inV2.isRepeating) {
/* All must be selected otherwise size would be zero.
* Repeating property will not change.
*/
if (!inV2.isNull[0]) {
outV.setConcat(0, vector1[0], start1[0], len1[0], vector2[0], start2[0], len2[0]);
}
outV.isRepeating = true;
} else if (inV1.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
if (!inV2.isNull[i]) {
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV2.isNull[0]) {
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
}
}
} else if (inV2.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
if (!inV2.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV2.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
}
}
} else {
if (batch.selectedInUse) {
for(int j=0; j != n; j++) {
int i = sel[j];
if (!inV2.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV2.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
}
}
}
} else if (!inV1.noNulls && inV2.noNulls) {
// propagate nulls
outV.noNulls = false;
if (inV1.isRepeating) {
//Output will also be repeating and null
outV.isRepeating = true;
outV.isNull[0] = true;
//return as no further processing is needed
return;
} else {
propagateNulls(batch.selectedInUse, n, sel, inV1, outV);
}
// perform data operation
if (inV1.isRepeating && inV2.isRepeating) {
//All must be selected otherwise size would be zero
//Repeating property will not change.
if (!inV1.isNull[0]) {
outV.setConcat(0, vector1[0], start1[0], len1[0], vector2[0], start2[0], len2[0]);
}
outV.isRepeating = true;
} else if (inV1.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
if (!inV1.isNull[0]) {
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV1.isNull[0]) {
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
}
}
} else if (inV2.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
if (!inV1.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV1.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
}
}
} else {
if (batch.selectedInUse) {
for(int j=0; j != n; j++) {
int i = sel[j];
if (!inV1.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV1.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
}
}
}
} else if (!inV1.noNulls && !inV2.noNulls) {
// propagate nulls
outV.noNulls = false;
if (inV1.isRepeating && inV2.isRepeating) {
outV.isNull[0] = inV1.isNull[0] || inV2.isNull[0];
//Output will also be repeating
outV.isRepeating = true;
// return if output is null because no additional work is needed
if (outV.isNull[0]) {
return;
}
} else if (inV1.isRepeating) {
if (inV1.isNull[0]) { // then all output will be null
outV.isRepeating = true;
outV.isNull[0] = true;
return;
} else {
outV.isRepeating = false;
propagateNulls(batch.selectedInUse, n, sel, inV2, outV);
}
} else if (inV2.isRepeating) {
if (inV2.isNull[0]) {
outV.isRepeating = true;
outV.isNull[0] = true;
return;
} else {
outV.isRepeating = false;
propagateNulls(batch.selectedInUse, n, sel, inV1, outV);
}
} else {
propagateNullsCombine(batch.selectedInUse, n, sel, inV1, inV2, outV);
}
// perform data operation
if (inV1.isRepeating && inV2.isRepeating) {
// All must be selected otherwise size would be zero. Repeating property will not change.
if (!inV1.isNull[0] && !inV2.isNull[0]) {
outV.setConcat(0, vector1[0], start1[0], len1[0], vector2[0], start2[0], len2[0]);
}
outV.isRepeating = true;
} else if (inV1.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
if (!inV1.isNull[0] && !inV2.isNull[i]) {
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV1.isNull[0] && !inV2.isNull[i]) {
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
}
}
} else if (inV2.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
if (!inV1.isNull[i] && !inV2.isNull[0]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV1.isNull[i] && !inV2.isNull[0]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
}
}
} else {
if (batch.selectedInUse) {
for(int j=0; j != n; j++) {
int i = sel[j];
if (!inV1.isNull[i] && !inV2.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
}
} else {
for(int i = 0; i != n; i++) {
if (!inV1.isNull[i] && !inV2.isNull[i]) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
}
}
}
} else { // there are no nulls in either input vector
// propagate null information
outV.noNulls = true;
// perform data operation
if (inV1.isRepeating && inV2.isRepeating) {
// All must be selected otherwise size would be zero. Repeating property will not change.
outV.setConcat(0, vector1[0], start1[0], len1[0], vector2[0], start2[0], len2[0]);
outV.isRepeating = true;
} else if (inV1.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
} else {
for(int i = 0; i != n; i++) {
outV.setConcat(i, vector1[0], start1[0], len1[0], vector2[i], start2[i], len2[i]);
}
}
} else if (inV2.isRepeating) {
if (batch.selectedInUse) {
for(int j = 0; j != n; j++) {
int i = sel[j];
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
} else {
for(int i = 0; i != n; i++) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[0], start2[0], len2[0]);
}
}
} else {
if (batch.selectedInUse) {
for(int j=0; j != n; j++) {
int i = sel[j];
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
} else {
for(int i = 0; i != n; i++) {
outV.setConcat(i, vector1[i], start1[i], len1[i], vector2[i], start2[i], len2[i]);
}
}
}
}
}