in holo-client/src/main/java/com/alibaba/hologres/client/impl/handler/GetActionHandler.java [54:140]
private void doHandleGetAction(TableSchema schema, TableName tableName, List<Get> recordList) {
long startTime = System.currentTimeMillis();
BitSet columnMask = new BitSet(schema.getColumnSchema().length);
for (Get get : recordList) {
columnMask.or(get.getRecord().getBitSet());
}
boolean first = true;
StringBuilder sb = new StringBuilder();
sb.append("select ");
for (PrimitiveIterator.OfInt it = columnMask.stream().iterator(); it.hasNext(); ) {
if (!first) {
sb.append(",");
}
first = false;
sb.append(IdentifierUtil.quoteIdentifier(schema.getColumn(it.next()).getName(), true));
}
sb.append(" from ").append(tableName.getFullName()).append(" where ");
for (int i = 0; i < recordList.size(); ++i) {
if (i > 0) {
sb.append(" or ");
}
first = true;
sb.append("( ");
for (String key : schema.getPrimaryKeys()) {
if (!first) {
sb.append(" and ");
}
first = false;
sb.append(IdentifierUtil.quoteIdentifier(key, true)).append("=?");
}
sb.append(" ) ");
}
String sql = sb.toString();
LOGGER.debug("Get sql:{}", sql);
try {
Map<RecordKey, Record> resultRecordMap = (Map<RecordKey, Record>) connectionHolder.retryExecute((conn) -> {
Map<RecordKey, Record> resultMap = new HashMap<>();
try (PreparedStatement ps = conn.prepareStatement(sql)) {
int paramIndex = 0;
for (Get get : recordList) {
Record record = get.getRecord();
for (int keyIndex : record.getKeyIndex()) {
ps.setObject(++paramIndex, record.getObject(keyIndex), record.getSchema().getColumn(keyIndex).getType());
}
}
ps.setQueryTimeout(config.getReadTimeoutMilliseconds() > 0 ? Math.max(config.getReadTimeoutMilliseconds() / 1000, 1) : 0);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
Record record = Record.build(schema);
int index = 0;
for (PrimitiveIterator.OfInt it = columnMask.stream().iterator(); it.hasNext(); ) {
int recordColumnIndex = it.next();
fillRecord(record, recordColumnIndex, rs, ++index, schema.getColumn(recordColumnIndex));
}
resultMap.put(new RecordKey(record), record);
}
}
long endTime = System.currentTimeMillis();
MetricRegistry registry = Metrics.registry();
registry.meter(Metrics.METRICS_DIMLOOKUP_QPS + tableName).mark();
registry.meter(Metrics.METRICS_DIMLOOKUP_RPS + tableName).mark(recordList.size());
registry.histogram(Metrics.METRICS_DIMLOOKUP_LATENCY + tableName).update(endTime - startTime);
registry.meter(Metrics.METRICS_DIMLOOKUP_RPS_ALL).mark(recordList.size());
}
return resultMap;
}, config.getReadRetryCount());
for (Get get : recordList) {
Record record = get.getRecord();
if (get.getFuture() != null) {
RecordKey key = new RecordKey(convertRecordColumnType(record));
Record result = resultRecordMap.get(key);
get.getFuture().complete(result);
}
}
} catch (Exception e) {
for (Get get : recordList) {
if (get.getFuture() != null && !get.getFuture().isDone()) {
get.getFuture().completeExceptionally(e);
}
}
}
}