forked from p81075629/datagear
[analysis]添加ResolvableDataSet类,用于为简化数据集预览功能提供支持
This commit is contained in:
parent
6327879a00
commit
92ebe89e9e
|
@ -27,6 +27,10 @@ public interface DataSet extends Identifiable
|
|||
* <p>
|
||||
* 属性列表描述{@linkplain #getResult(Map)}返回的{@linkplain DataSetResult#getData()}的对象结构。
|
||||
* </p>
|
||||
* <p>
|
||||
* 属性列表并不一定与{@linkplain DataSetResult#getData()}的对象结构严格一致,
|
||||
* 通常是{@linkplain DataSetResult#getData()}对象包含相同、或者更多的属性。
|
||||
* </p>
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Copyright (c) 2018 datagear.tech. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.datagear.analysis;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 可解析{@linkplain DataSetResult}。
|
||||
* <p>
|
||||
* 调用{@linkplain #resolve(Map)}无需预先设置{@linkplain #getProperties()}。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
*/
|
||||
public interface ResolvableDataSet extends DataSet
|
||||
{
|
||||
/**
|
||||
* 解析{@linkplain ResolvedDataSetResult}。
|
||||
*
|
||||
* @param paramValues
|
||||
* @return
|
||||
* @throws DataSetException
|
||||
*/
|
||||
ResolvedDataSetResult resolve(Map<String, ?> paramValues) throws DataSetException;
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Copyright (c) 2018 datagear.tech. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.datagear.analysis;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 数据集解析结果。
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
*/
|
||||
public class ResolvedDataSetResult
|
||||
{
|
||||
private DataSetResult result;
|
||||
|
||||
private List<DataSetProperty> properties;
|
||||
|
||||
public ResolvedDataSetResult()
|
||||
{
|
||||
}
|
||||
|
||||
public ResolvedDataSetResult(DataSetResult result, List<DataSetProperty> properties)
|
||||
{
|
||||
super();
|
||||
this.result = result;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
public DataSetResult getResult()
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setResult(DataSetResult result)
|
||||
{
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
public List<DataSetProperty> getProperties()
|
||||
{
|
||||
return properties;
|
||||
}
|
||||
|
||||
public void setProperties(List<DataSetProperty> properties)
|
||||
{
|
||||
this.properties = properties;
|
||||
}
|
||||
}
|
|
@ -7,9 +7,15 @@
|
|||
*/
|
||||
package org.datagear.analysis.support;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.datagear.analysis.DataSetException;
|
||||
import org.datagear.analysis.DataSetProperty;
|
||||
import org.datagear.analysis.DataSetResult;
|
||||
import org.datagear.analysis.ResolvableDataSet;
|
||||
import org.datagear.analysis.ResolvedDataSetResult;
|
||||
|
||||
/**
|
||||
* 抽象JSON数据集。
|
||||
|
@ -17,7 +23,7 @@ import org.datagear.analysis.DataSetProperty;
|
|||
* @author datagear@163.com
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractJsonDataSet extends AbstractFmkTemplateDataSet
|
||||
public abstract class AbstractJsonDataSet extends AbstractFmkTemplateDataSet implements ResolvableDataSet
|
||||
{
|
||||
public static final JsonDataSetSupport JSON_DATA_SET_SUPPORT = new JsonDataSetSupport();
|
||||
|
||||
|
@ -26,6 +32,12 @@ public abstract class AbstractJsonDataSet extends AbstractFmkTemplateDataSet
|
|||
super();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public AbstractJsonDataSet(String id, String name)
|
||||
{
|
||||
super(id, name, Collections.EMPTY_LIST);
|
||||
}
|
||||
|
||||
public AbstractJsonDataSet(String id, String name, List<DataSetProperty> properties)
|
||||
{
|
||||
super(id, name, properties);
|
||||
|
@ -35,4 +47,13 @@ public abstract class AbstractJsonDataSet extends AbstractFmkTemplateDataSet
|
|||
{
|
||||
return JSON_DATA_SET_SUPPORT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResolvedDataSetResult resolve(Map<String, ?> paramValues) throws DataSetException
|
||||
{
|
||||
DataSetResult result = getResult(paramValues);
|
||||
List<DataSetProperty> properties = getJsonDataSetSupport().resolveDataSetProperties(result.getData());
|
||||
|
||||
return new ResolvedDataSetResult(result, properties);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,6 +33,11 @@ public abstract class AbstractJsonFileDataSet extends AbstractJsonSourceDataSet
|
|||
super();
|
||||
}
|
||||
|
||||
public AbstractJsonFileDataSet(String id, String name)
|
||||
{
|
||||
super(id, name);
|
||||
}
|
||||
|
||||
public AbstractJsonFileDataSet(String id, String name, List<DataSetProperty> properties)
|
||||
{
|
||||
super(id, name, properties);
|
||||
|
|
|
@ -32,6 +32,11 @@ public abstract class AbstractJsonSourceDataSet extends AbstractJsonDataSet
|
|||
super();
|
||||
}
|
||||
|
||||
public AbstractJsonSourceDataSet(String id, String name)
|
||||
{
|
||||
super(id, name);
|
||||
}
|
||||
|
||||
public AbstractJsonSourceDataSet(String id, String name, List<DataSetProperty> properties)
|
||||
{
|
||||
super(id, name, properties);
|
||||
|
|
|
@ -32,6 +32,12 @@ public class JsonValueDataSet extends AbstractJsonDataSet
|
|||
super();
|
||||
}
|
||||
|
||||
public JsonValueDataSet(String id, String name, String value)
|
||||
{
|
||||
super(id, name);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public JsonValueDataSet(String id, String name, List<DataSetProperty> properties, String value)
|
||||
{
|
||||
super(id, name, properties);
|
||||
|
|
|
@ -27,6 +27,12 @@ public class SimpleJsonFileDataSet extends AbstractJsonFileDataSet
|
|||
super();
|
||||
}
|
||||
|
||||
public SimpleJsonFileDataSet(String id, String name, File file)
|
||||
{
|
||||
super(id, name);
|
||||
this.file = file;
|
||||
}
|
||||
|
||||
public SimpleJsonFileDataSet(String id, String name, List<DataSetProperty> properties, File file)
|
||||
{
|
||||
super(id, name, properties);
|
||||
|
|
|
@ -17,6 +17,8 @@ import org.datagear.analysis.DataSet;
|
|||
import org.datagear.analysis.DataSetException;
|
||||
import org.datagear.analysis.DataSetProperty;
|
||||
import org.datagear.analysis.DataSetResult;
|
||||
import org.datagear.analysis.ResolvableDataSet;
|
||||
import org.datagear.analysis.ResolvedDataSetResult;
|
||||
import org.datagear.util.JdbcUtil;
|
||||
import org.datagear.util.QueryResultSet;
|
||||
import org.datagear.util.Sql;
|
||||
|
@ -31,7 +33,7 @@ import org.datagear.util.resource.ConnectionFactory;
|
|||
* @author datagear@163.com
|
||||
*
|
||||
*/
|
||||
public class SqlDataSet extends AbstractFmkTemplateDataSet
|
||||
public class SqlDataSet extends AbstractFmkTemplateDataSet implements ResolvableDataSet
|
||||
{
|
||||
protected static final SqlDataSetSupport SQL_DATA_SET_SUPPORT = new SqlDataSetSupport();
|
||||
|
||||
|
@ -74,6 +76,32 @@ public class SqlDataSet extends AbstractFmkTemplateDataSet
|
|||
|
||||
@Override
|
||||
public DataSetResult getResult(Map<String, ?> paramValues) throws DataSetException
|
||||
{
|
||||
List<DataSetProperty> properties = getProperties();
|
||||
|
||||
if (properties == null || properties.isEmpty())
|
||||
throw new DataSetException("[getProperties()] must not be empty");
|
||||
|
||||
ResolvedDataSetResult result = getResolvedDataSetResult(paramValues, properties);
|
||||
return result.getResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResolvedDataSetResult resolve(Map<String, ?> paramValues) throws DataSetException
|
||||
{
|
||||
return getResolvedDataSetResult(paramValues, null);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param paramValues
|
||||
* @param properties
|
||||
* 允许为{@code null},此时会自动解析
|
||||
* @return
|
||||
* @throws DataSetException
|
||||
*/
|
||||
protected ResolvedDataSetResult getResolvedDataSetResult(Map<String, ?> paramValues,
|
||||
List<DataSetProperty> properties) throws DataSetException
|
||||
{
|
||||
String sql = resolveTemplate(getSql(), paramValues);
|
||||
|
||||
|
@ -89,23 +117,57 @@ public class SqlDataSet extends AbstractFmkTemplateDataSet
|
|||
throw new SqlDataSetConnectionException(e);
|
||||
}
|
||||
|
||||
Sql sqlObj = Sql.valueOf(sql);
|
||||
|
||||
QueryResultSet qrs = null;
|
||||
|
||||
try
|
||||
{
|
||||
return getResult(cn, sql);
|
||||
qrs = getSqlDataSetSupport().executeQuery(cn, sqlObj, ResultSet.TYPE_FORWARD_ONLY);
|
||||
ResultSet rs = qrs.getResultSet();
|
||||
|
||||
if (properties == null || properties.isEmpty())
|
||||
properties = getSqlDataSetSupport().resolveDataSetProperties(cn, rs, null);
|
||||
|
||||
List<Map<String, ?>> data = getSqlDataSetSupport().resolveResultData(cn, rs, properties);
|
||||
DataSetResult result = new DataSetResult(data);
|
||||
|
||||
return new ResolvedDataSetResult(result, properties);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new SqlDataSetSqlExecutionException(sql, e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
getConnectionFactory().release(cn);
|
||||
QueryResultSet.close(qrs);
|
||||
}
|
||||
catch (Exception e)
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
getConnectionFactory().release(cn);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected DataSetResult getResult(Connection cn, String sql) throws DataSetException
|
||||
/**
|
||||
*
|
||||
* @param cn
|
||||
* @param sql
|
||||
* @param properties
|
||||
* 允许为{@code null},此时会自动解析
|
||||
* @return
|
||||
* @throws DataSetException
|
||||
*/
|
||||
protected ResolvedDataSetResult getResolvedDataSetResult(Connection cn, String sql,
|
||||
List<DataSetProperty> properties) throws DataSetException
|
||||
{
|
||||
Sql sqlObj = Sql.valueOf(sql);
|
||||
|
||||
|
@ -114,7 +176,15 @@ public class SqlDataSet extends AbstractFmkTemplateDataSet
|
|||
try
|
||||
{
|
||||
qrs = getSqlDataSetSupport().executeQuery(cn, sqlObj, ResultSet.TYPE_FORWARD_ONLY);
|
||||
return toDataSetResult(cn, qrs.getResultSet());
|
||||
ResultSet rs = qrs.getResultSet();
|
||||
|
||||
if (properties == null || properties.isEmpty())
|
||||
properties = getSqlDataSetSupport().resolveDataSetProperties(cn, rs, null);
|
||||
|
||||
List<Map<String, ?>> data = getSqlDataSetSupport().resolveResultData(cn, rs, properties);
|
||||
DataSetResult result = new DataSetResult(data);
|
||||
|
||||
return new ResolvedDataSetResult(result, properties);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
|
@ -126,14 +196,6 @@ public class SqlDataSet extends AbstractFmkTemplateDataSet
|
|||
}
|
||||
}
|
||||
|
||||
public DataSetResult toDataSetResult(Connection cn, ResultSet rs) throws SQLException
|
||||
{
|
||||
List<Map<String, ?>> data = getSqlDataSetSupport().resolveResultData(cn, rs, getProperties());
|
||||
DataSetResult result = new DataSetResult(data);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected SqlDataSetSupport getSqlDataSetSupport()
|
||||
{
|
||||
return SQL_DATA_SET_SUPPORT;
|
||||
|
|
|
@ -90,6 +90,9 @@ public class QueryResultSet
|
|||
|
||||
/**
|
||||
* 关闭。
|
||||
* <p>
|
||||
* 此方法不会抛出任何{@linkplain Throwable}。
|
||||
* </p>
|
||||
*/
|
||||
public void close()
|
||||
{
|
||||
|
@ -100,6 +103,12 @@ public class QueryResultSet
|
|||
JdbcUtil.closeStatement(this.statement);
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭。
|
||||
* <p>
|
||||
* 此方法不会抛出任何{@linkplain Throwable}。
|
||||
* </p>
|
||||
*/
|
||||
public static void close(QueryResultSet qrs)
|
||||
{
|
||||
if (qrs != null)
|
||||
|
|
Loading…
Reference in New Issue