/** * Append the specified IEntryResult[] to the IEntryResult to create a single result representing * an index entry that was split across multiple index records. * * @param result * @param continuationResults * @param blockSize */ public static IEntryResult joinEntryResults( final IEntryResult result, final IEntryResult[] continuationResults, final int blockSize) { CoreArgCheck.isNotNull(result); // If the IEntryResult is not continued on another record, return the original char[] baseResult = result.getWord(); if (baseResult.length < blockSize || baseResult[blockSize - 1] != IndexConstants.RECORD_TYPE.RECORD_CONTINUATION) { return result; } // Extract the UUID string from the original result String baseStr = new String(baseResult); String objectID = extractUUIDString(result); // Create and initialize a StringBuffer to store the concatenated result StringBuffer sb = new StringBuffer(); sb.append(baseStr.substring(0, blockSize - 1)); // Append the continuation results onto the original - // assumes the IEntryResult[] are in ascending order of segment number final IEntryResult[] sortedResults = sortContinuationResults(objectID, continuationResults); for (int i = 0; i < sortedResults.length; i++) { char[] continuation = sortedResults[i].getWord(); int segNumber = getContinuationSegmentNumber(objectID, sortedResults[i]); int beginIndex = objectID.length() + Integer.toString(segNumber).length() + 5; for (int j = beginIndex; j < continuation.length; j++) { if (j < blockSize - 1) { sb.append(continuation[j]); } } } return new EntryResult(sb.toString().toCharArray(), result.getFileReferences()); }
public static int getContinuationSegmentNumber( final String objectID, final IEntryResult continuationResult) { // The header portion of the continuation record is of the form: // RECORD_CONTINUATION|objectID|segmentCount| char[] record = continuationResult.getWord(); int segNumber = -1; int index = objectID.length() + 4; if (record[index + 1] == IndexConstants.RECORD_STRING.RECORD_DELIMITER) { // segment count < 10 segNumber = Character.getNumericValue(record[index]); } else if (record[index + 2] == IndexConstants.RECORD_STRING.RECORD_DELIMITER) { // 9 < segment count < 100 char[] temp = new char[] {record[index], record[index + 1]}; String segCount = new String(temp); segNumber = Integer.parseInt(segCount); } else if (record[index + 3] == IndexConstants.RECORD_STRING.RECORD_DELIMITER) { // 99 < segment count < 1000 char[] temp = new char[] {record[index], record[index + 1], record[index + 2]}; String segCount = new String(temp); segNumber = Integer.parseInt(segCount); } return segNumber; }
/** * Return the {@link org.teiid.designer.metadata.runtime.MetadataRecord} instances for specified * IEntryResult. * * @param entryResult * @param container Container reference to be set on the record */ public static MetadataRecord getMetadataRecord( final IEntryResult queryResult, final EObjectFinder container) { MetadataRecord record = getMetadataRecord(queryResult.getWord()); if (record instanceof AbstractMetadataRecord) { ((AbstractMetadataRecord) record).setEObjectFinder(container); } return record; }
/** * Extract the UUID string from the IEntryResult * * @param result */ public static String extractUUIDString(final IEntryResult result) { CoreArgCheck.isNotNull(result); char[] word = result.getWord(); String baseStr = new String(word); int beginIndex = baseStr.indexOf(UUID.PROTOCOL); int endIndex = word.length; CoreArgCheck.isNonNegative(beginIndex); for (int i = beginIndex; i < word.length; i++) { if (word[i] == IndexConstants.RECORD_STRING.RECORD_DELIMITER) { endIndex = i; break; } } CoreArgCheck.isTrue(beginIndex < endIndex, "begin index should be less than end index"); return baseStr.substring(beginIndex, endIndex); }