@Override protected int[] createFieldPermutationForBulkLoadOp() { /** * after tokenization, the field layout becomes * [token, num?, tag, primary key, filter value] * we need to restore it back to * [tag, token, num?, primary key, filter value] */ int[] fieldPermutation = new int[NUM_TAG_FIELDS + numTokenKeyPairFields + numFilterFields]; int numSecondaryKeys = getNumSecondaryKeys(); int idx = 0; // set tag fields for (int i = 0; i < NUM_TAG_FIELDS; i++) { fieldPermutation[idx++] = i + numSecondaryKeys; } // set secondary keys for (int i = 0; i < numSecondaryKeys; i++) { fieldPermutation[idx++] = i; } // set primary key + filter for (int i = 0; i < numPrimaryKeys + numFilterFields; i++) { fieldPermutation[idx++] = i + NUM_TAG_FIELDS + numSecondaryKeys; } return fieldPermutation; }
@Override protected ExternalSortOperatorDescriptor createSortOp(JobSpecification spec, IBinaryComparatorFactory[] taggedSecondaryComparatorFactories, RecordDescriptor taggedSecondaryRecDesc) { /** * after tokenization, the field layout becomes * [token, num?, tag, primary key, filter value] * we need to sort on * [tag, token, num?, primary key] */ int[] taggedSortFields = new int[taggedSecondaryComparatorFactories.length]; int numSecondaryKeys = getNumSecondaryKeys(); int idx = 0; // set component pos fields taggedSortFields[idx++] = numSecondaryKeys; // set secondary keys for (int i = 0; i < numSecondaryKeys; i++) { taggedSortFields[idx++] = i; } // set primary keys for (int i = 0; i < numPrimaryKeys; i++) { taggedSortFields[idx++] = i + numSecondaryKeys + NUM_TAG_FIELDS; } ExternalSortOperatorDescriptor sortOp = new ExternalSortOperatorDescriptor(spec, sortNumFrames, taggedSortFields, taggedSecondaryComparatorFactories, taggedSecondaryRecDesc); AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, sortOp, primaryPartitionConstraint); return sortOp; }
createFieldPermutationForBulkLoadOp(), getNumSecondaryKeys(), numPrimaryKeys, true);