in src/main/java/com/aliyun/oss/internal/OSSObjectOperation.java [237:292]
public OSSObject selectObject(SelectObjectRequest selectObjectRequest) throws OSSException, ClientException {
assertParameterNotNull(selectObjectRequest, "selectObjectRequest");
String bucketName = selectObjectRequest.getBucketName();
String key = selectObjectRequest.getKey();
assertParameterNotNull(bucketName, "bucketName");
assertParameterNotNull(key, "key");
ensureBucketNameValid(bucketName);
ensureObjectKeyValid(key);
Map<String, String> headers = new HashMap<String, String>();
populateGetObjectRequestHeaders(selectObjectRequest, headers);
populateRequestPayerHeader(headers, selectObjectRequest.getRequestPayer());
Map<String, String> params = new HashMap<String, String>();
populateResponseHeaderParameters(params, selectObjectRequest.getResponseHeaders());
String process = selectObjectRequest.getProcess();
assertParameterNotNull(process, "process");
params.put(RequestParameters.SUBRESOURCE_PROCESS, process);
SelectObjectRequest.ExpressionType expressionType = selectObjectRequest.getExpressionType();
if (expressionType != SelectObjectRequest.ExpressionType.SQL) {
throw new IllegalArgumentException("Select object only support sql expression");
}
if (selectObjectRequest.getExpression() == null) {
throw new IllegalArgumentException("Select expression is null");
}
if (selectObjectRequest.getLineRange() != null && selectObjectRequest.getSplitRange() != null) {
throw new IllegalArgumentException("Line range and split range of select request should not both set");
}
byte[] content = selectObjectRequestMarshaller.marshall(selectObjectRequest);
headers.put(HttpHeaders.CONTENT_MD5, BinaryUtil.toBase64String(BinaryUtil.calculateMd5(content)));
RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(selectObjectRequest))
.setMethod(HttpMethod.POST).setBucket(bucketName).setKey(key).setHeaders(headers)
.setInputSize(content.length).setInputStream(new ByteArrayInputStream(content))
.setParameters(params).setOriginalRequest(selectObjectRequest).build();
//select progress listener(scanned bytes)
final ProgressListener selectProgressListener = selectObjectRequest.getSelectProgressListener();
try {
OSSObject ossObject = doOperation(request, new GetObjectResponseParser(bucketName, key), bucketName, key, true);
publishProgress(selectProgressListener, ProgressEventType.SELECT_STARTED_EVENT);
InputStream inputStream = ossObject.getObjectContent();
if (!Boolean.parseBoolean(ossObject.getObjectMetadata().getRawMetadata().get(OSS_SELECT_OUTPUT_RAW).toString())) {
SelectInputStream selectInputStream = new SelectInputStream(inputStream, selectProgressListener,
selectObjectRequest.getOutputSerialization().isPayloadCrcEnabled());
selectInputStream.setRequestId(ossObject.getRequestId());
ossObject.setObjectContent(selectInputStream);
}
return ossObject;
} catch (RuntimeException e) {
publishProgress(selectProgressListener, ProgressEventType.SELECT_FAILED_EVENT);
throw e;
}
}