All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.huaweicloud.dws.client.executor.GetExecutor Maven / Gradle / Ivy


package com.huaweicloud.dws.client.executor;

import com.huaweicloud.dws.client.DwsConfig;
import com.huaweicloud.dws.client.exception.DwsClientException;
import com.huaweicloud.dws.client.model.Record;
import com.huaweicloud.dws.client.model.TableSchema;
import com.huaweicloud.dws.client.op.Get;
import com.huaweicloud.dws.client.util.JdbcUtil;
import com.huaweicloud.dws.client.util.LogUtil;
import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PrimitiveIterator;

import static com.huaweicloud.dws.client.handler.AbstractActionHandler.fillRecord;

/**
 * @ProjectName: dws-client
 * @Description: get操作执行器
 * @Date: 2023/10/09
 */
@Slf4j
public class GetExecutor {
    public Map execute(TableSchema schema, List recordList,
        Connection connection, DwsConfig config) throws DwsClientException, SQLException {
        String sql = JdbcUtil.getBatchSelectFromStatement(schema, schema.getTableName(), recordList);
        BitSet columnMask = new BitSet(schema.getColumns().size());
        for (Get get : recordList) {
            columnMask.or(get.getRecord().getColumnBit());
        }
        ResultSet rs = null;
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            int paramIndex = 0;
            for (Get get : recordList) {
                Record record = get.getRecord();
                for (int keyIndex : schema.getKeyIndexList()) {
                    ps.setObject(++paramIndex, record.getValue(keyIndex),
                            record.getTableSchema().getColumn(keyIndex).getType());
                }
            }
            ps.setQueryTimeout(
                    config.getReadTimeoutMilliseconds() > 0 ? Math.max(config.getReadTimeoutMilliseconds() / 1000, 1) : 0);
            LogUtil.withLogSwitch(config, () -> log.info("select sql {}", sql));
            rs = ps.executeQuery();
            return parseRecordMap(rs, columnMask, schema);
        } catch (Exception e) {
            log.error("Get executor execute fail. sql = {}, err = {}", sql, e.getMessage());
            throw DwsClientException.fromException(e);
        } finally {
            if (rs != null) {
                rs.close();
            }
        }
    }

    private Map parseRecordMap(ResultSet rs, BitSet columnMask, TableSchema schema)
        throws SQLException {
        Map resultMap = new HashMap<>();
        while (rs != null && rs.next()) {
            Record record = new Record(schema);
            int index = 0;
            for (PrimitiveIterator.OfInt it = columnMask.stream().iterator(); it.hasNext();) {
                int recordColumnIndex = it.next();

                // 将查询结果填充record
                fillRecord(record, recordColumnIndex, rs, ++index, schema.getColumn(recordColumnIndex));
            }
            resultMap.put(record.getRecordKey(), record);
        }
        return resultMap;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy