com.github.housepower.jdbc.ClickHouseResultSet Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of clickhouse-native-jdbc Show documentation
Show all versions of clickhouse-native-jdbc Show documentation
ClickHouse Native Protocol JDBC implementation
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.housepower.jdbc;
import com.github.housepower.jdbc.data.Block;
import com.github.housepower.jdbc.data.IColumn;
import com.github.housepower.jdbc.misc.CheckedIterator;
import com.github.housepower.jdbc.misc.Validate;
import com.github.housepower.jdbc.protocol.DataResponse;
import com.github.housepower.jdbc.statement.ClickHouseStatement;
import com.github.housepower.jdbc.wrapper.SQLResultSet;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.*;
public class ClickHouseResultSet implements SQLResultSet {
private int row = -1;
private Block current = new Block();
private int lastFetchRow = -1;
private int lastFetchColumn = -1;
private Block lastFetchBlock = null;
private final Block header;
private final String db;
private final String table;
private final ClickHouseStatement statement;
private final CheckedIterator iterator;
private boolean isFirst = false;
private boolean isAfterLast = false;
private boolean isClosed = false;
public ClickHouseResultSet(Block header, String db,
String table,
CheckedIterator iterator,
ClickHouseStatement statement) {
this.header = header;
this.db = db;
this.table = table;
this.iterator = iterator;
this.statement = statement;
}
@Override
public boolean getBoolean(String name) throws SQLException {
return this.getBoolean(this.findColumn(name));
}
@Override
public int getInt(String name) throws SQLException {
return this.getInt(this.findColumn(name));
}
@Override
public URL getURL(String name) throws SQLException {
return this.getURL(this.findColumn(name));
}
@Override
public byte getByte(String name) throws SQLException {
return this.getByte(this.findColumn(name));
}
@Override
public Date getDate(String name) throws SQLException {
return this.getDate(this.findColumn(name));
}
@Override
public long getLong(String name) throws SQLException {
return this.getLong(this.findColumn(name));
}
@Override
public Array getArray(String name) throws SQLException {
return this.getArray(this.findColumn(name));
}
@Override
public float getFloat(String name) throws SQLException {
return this.getFloat(this.findColumn(name));
}
@Override
public short getShort(String name) throws SQLException {
return this.getShort(this.findColumn(name));
}
@Override
public double getDouble(String name) throws SQLException {
return this.getDouble(this.findColumn(name));
}
@Override
public String getString(String name) throws SQLException {
return this.getString(this.findColumn(name));
}
@Override
public Object getObject(String name) throws SQLException {
return this.getObject(this.findColumn(name));
}
@Override
public Timestamp getTimestamp(String name) throws SQLException {
return this.getTimestamp(this.findColumn(name));
}
@Override
public BigDecimal getBigDecimal(String name) throws SQLException {
return this.getBigDecimal(this.findColumn(name));
}
@Override
public boolean isBeforeFirst() throws SQLException {
return row == -1;
}
@Override
public boolean isAfterLast() throws SQLException {
return isAfterLast;
}
@Override
public boolean isFirst() throws SQLException {
return isFirst;
}
@Override
public boolean first() throws SQLException {
throw new SQLException("TYPE_FORWARD_ONLY");
}
@Override
public boolean last() throws SQLException {
throw new SQLException("TYPE_FORWARD_ONLY");
}
@Override
public void setFetchDirection(int direction) throws SQLException {
}
@Override
public int getFetchDirection() throws SQLException {
return ResultSet.FETCH_FORWARD;
}
@Override
public void setFetchSize(int rows) throws SQLException {
}
@Override
public int getFetchSize() throws SQLException {
return Integer.MAX_VALUE;
}
/*===================================================================*/
@Override
public boolean getBoolean(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return false;
}
return (boolean) data;
}
@Override
public int getInt(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return 0;
}
return ((Number) data).intValue();
}
@Override
public URL getURL(int index) throws SQLException {
try {
return new URL(this.getString(index));
} catch (MalformedURLException ex) {
throw new SQLException(ex.getMessage(), ex);
}
}
@Override
public byte getByte(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return 0;
}
return ((Number) data).byteValue();
}
@Override
public Date getDate(int index) throws SQLException {
Object data = getObject(index);
return (Date) data;
}
@Override
public long getLong(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return 0;
}
return ((Number) data).longValue();
}
@Override
public Array getArray(int index) throws SQLException {
Object data = getObject(index);
return (Array) data;
}
@Override
public float getFloat(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return 0;
}
return ((Number) data).floatValue();
}
@Override
public short getShort(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return 0;
}
return ((Number) data).shortValue();
}
@Override
public double getDouble(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return 0;
}
return ((Number) data).doubleValue();
}
@Override
public String getString(int index) throws SQLException {
Object data = getObject(index);
if (data == null) {
return null;
}
// TODO format by IDataType
return data.toString();
}
@Override
public Object getObject(int index) throws SQLException {
Validate.isTrue(row >= 0 && row < current.rows(),
"No row information was obtained.You must call ResultSet.next() before that.");
IColumn column = (lastFetchBlock = current).getByPosition((lastFetchColumn = index - 1));
return column.values((lastFetchRow = row));
}
@Override
public Timestamp getTimestamp(int index) throws SQLException {
Object data = getObject(index);
return (Timestamp) data;
}
@Override
public BigDecimal getBigDecimal(int index) throws SQLException {
Object data = getObject(index);
return new BigDecimal(data.toString());
}
/*==================================================================*/
@Override
public int getType() throws SQLException {
return ResultSet.TYPE_FORWARD_ONLY;
}
@Override
public void close() throws SQLException {
this.isClosed = true;
}
@Override
public boolean wasNull() throws SQLException {
Validate.isTrue(lastFetchBlock != null, "Please call Result.next()");
Validate.isTrue(lastFetchColumn >= 0, "Please call Result.getXXX()");
Validate.isTrue(lastFetchRow >= 0 && lastFetchRow < lastFetchBlock.rows(), "Please call Result.next()");
return lastFetchBlock.getByPosition(lastFetchColumn).values(lastFetchRow) == null;
}
@Override
public boolean isClosed() throws SQLException {
return this.isClosed;
}
@Override
public Statement getStatement() throws SQLException {
return statement;
}
@Override
public int findColumn(String name) throws SQLException {
return header.getPositionByName(name);
}
@Override
public ResultSetMetaData getMetaData() throws SQLException {
return new ClickHouseResultSetMetaData(header, db, table);
}
@Override
public boolean next() throws SQLException {
boolean isBeforeFirst = isBeforeFirst();
boolean hasNext = ++row < current.rows() || (row = 0) < (current = fetchBlock()).rows();
isFirst = isBeforeFirst && hasNext;
isAfterLast = !hasNext;
return hasNext;
}
private Block fetchBlock() throws SQLException {
while (iterator.hasNext()) {
DataResponse next = iterator.next();
if (next.block().rows() > 0) {
return next.block();
}
}
return new Block();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy