Ver código fonte

clickhouse支持

rsbi 3 anos atrás
pai
commit
1a7672133a

BIN
libs/ext3-1.5.jar


+ 6 - 1
pom.xml

@@ -202,13 +202,18 @@
             <artifactId>javase</artifactId>
             <version>3.3.0</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc -->
+        <dependency>
+            <groupId>com.clickhouse</groupId>
+            <artifactId>clickhouse-jdbc</artifactId>
+            <version>0.3.2-patch9</version>
+        </dependency>
         <dependency>
             <groupId>javax.servlet.jsp</groupId>
             <artifactId>jsp-api</artifactId>
             <version>2.2</version>
             <scope>provided</scope>
         </dependency>
-
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>

+ 22 - 20
src/main/java/com/ruisitech/bi/service/model/DataSourceService.java

@@ -39,19 +39,19 @@ public class DataSourceService {
 	public static final String showTables_hive = "show tables";
 	public static final String showTables_kylin = "show tables";
 	**/
-	
+
 	private Logger log = Logger.getLogger(DataSourceService.class);
-	
+
 	@Autowired
 	private DataSourceMapper mapper;
-	
+
 	@Autowired
 	private ModelCacheService cacheService;
-	
+
 	public List<DataSource> listDataSource(){
 		return mapper.listDataSource();
 	}
-	
+
 	public void insertDataSource(DataSource ds){
 		ds.setDsid(UUID.randomUUID().toString().replaceAll("-", ""));
 		if("jndi".equals(ds.getUse())){
@@ -59,7 +59,7 @@ public class DataSourceService {
 		}
 		mapper.insertDataSource(ds);
 	}
-	
+
 	public void updateDataSource(DataSource ds){
 		if("jndi".equals(ds.getUse())){
 			ds.setDsname(ds.getJndiName());
@@ -68,23 +68,23 @@ public class DataSourceService {
 		//清除缓存
 		this.cacheService.removeDsource(ds.getDsid());
 	}
-	
+
 	public void deleteDataSource(String dsid){
 		mapper.deleteDataSource(dsid);
 		//清除缓存
 		this.cacheService.removeDsource(dsid);
 	}
-	
+
 	public DataSource getDataSource(String dsid){
 		return mapper.getDataSource(dsid);
 	}
-	
+
 	public Result testJNDI(DataSource ds){
 		Result ret = new Result();
 		Connection con = null;
 		try{
-		  	Context ctx = new InitialContext();      
-		    String strLookup = "java:comp/env/"+ds.getJndiName(); 
+		  	Context ctx = new InitialContext();
+		    String strLookup = "java:comp/env/"+ds.getJndiName();
 		    javax.sql.DataSource sds = (javax.sql.DataSource) ctx.lookup(strLookup);
 		    con = sds.getConnection();
 		    if (con != null){
@@ -107,7 +107,7 @@ public class DataSourceService {
 		}
 		return ret;
 	}
-	
+
 	public Connection getJDBC(DataSource ds) throws Exception{
 		try {
 			Connection conn = null;
@@ -118,12 +118,12 @@ public class DataSourceService {
 			throw e;
 		}
 	}
-	
+
 	public Connection getJndi(DataSource ds) throws Exception {
 		Connection con = null;
 		try {
-			Context ctx = new InitialContext();      
-		    String strLookup = "java:comp/env/"+ds.getJndiName(); 
+			Context ctx = new InitialContext();
+		    String strLookup = "java:comp/env/"+ds.getJndiName();
 		    javax.sql.DataSource sds =(javax.sql.DataSource) ctx.lookup(strLookup);
 		    con = sds.getConnection();
 		}catch(Exception ex){
@@ -132,7 +132,7 @@ public class DataSourceService {
 		}
 	    return con;
 	}
-	
+
 	public Result testDataSource(DataSource ds) throws ExtConfigException {
 		Result ret = new Result();
 		String clazz = ds.getClazz();
@@ -160,7 +160,7 @@ public class DataSourceService {
 		}
 		return ret;
 	}
-	
+
 	public List<Map<String, Object>> listTables(String dsid, String searchTname) throws Exception{
 		DataSource ds = mapper.getDataSource(dsid);
 		final List<Map<String, Object>> ret = new ArrayList<Map<String, Object>>();
@@ -174,6 +174,8 @@ public class DataSourceService {
 			String schem = null;
 			if("oracle".equals(ds.getLinkType())){
 				schem = ds.getLinkName().toUpperCase();
+			}else if("clickhouse".equals(ds.getLinkType())){
+				schem = conn.getSchema();
 			}
 			if("postgresql".equals(ds.getLinkType())) {
 				if (ds.getLinkUrl().toLowerCase().indexOf("schema") > 0) {
@@ -200,7 +202,7 @@ public class DataSourceService {
 				ret.add(m);
 			}
 			tbs.close();
-			
+
 			/**
 			String qsql = null;
 			if("mysql".equals(ds.getLinkType())){
@@ -219,8 +221,8 @@ public class DataSourceService {
 				qsql = showTables_kylin;
 			}
 			ResultSet tbs = conn.getMetaData().getTables(null, null, "%", new String[]{"TABLE"});
-			
-		
+
+
 			while(tbs.next()){
 				for(int i=0; i<tbs.getMetaData().getColumnCount(); i++){
 					String col = tbs.getMetaData().getColumnLabel(i + 1);

+ 41 - 26
src/main/java/com/ruisitech/bi/service/model/DatasetService.java

@@ -29,22 +29,22 @@ public class DatasetService extends BaseCompService {
 
 	@Autowired
 	private DatasetMapper mapper;
-	
+
 	@Autowired
 	private DataSourceService dsService;
-	
+
 	@Autowired
 	private ModelCacheService cacheService;
-	
+
 	@Autowired
 	private DimensionMapper dimMapper;
 
 	private static Logger logger = Logger.getLogger(DatasetService.class);
-	
+
 	public List<Dataset> listDataset(){
 		return mapper.listDataset();
 	}
-	
+
 	@Transactional(rollbackFor = Exception.class)
 	public void updateDset(Dataset ds){
 		mapper.updateDset(ds);
@@ -64,15 +64,15 @@ public class DatasetService extends BaseCompService {
 				dimMapper.updateColType(param);
 			}
 		}
-		
+
 		//删除缓存
 		cacheService.removeDset(ds.getDsid());
 	}
-	
+
 	/**
 	 * 重新加载数据集的字段
 	 * @param dsetId
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	public void reloadDset(String dsetId, String dsid) throws Exception{
 		String cfg = mapper.getDatasetCfg(dsetId);
@@ -102,7 +102,7 @@ public class DatasetService extends BaseCompService {
 		//删除缓存
 		cacheService.removeDset(ds.getDsetId());
 	}
-	
+
 	private boolean existCol(String colName, JSONArray cols){
 		boolean ext = false;
 		for(int i=0; i<cols.size(); i++){
@@ -115,21 +115,21 @@ public class DatasetService extends BaseCompService {
 		}
 		return ext;
 	}
-	
+
 	public void insertDset(Dataset ds){
 		mapper.insertDset(ds);
 	}
-	
+
 	public void deleteDset(String dsetId){
 		mapper.deleteDset(dsetId);
 		//删除缓存
 		cacheService.removeDset(dsetId);
 	}
-	
+
 	public String getDatasetCfg(String dsetId){
 		return mapper.getDatasetCfg(dsetId);
 	}
-	
+
 	public List<DSColumn> listTableColumns(String dsid, String tname) throws Exception{
 		DataSource ds = dsService.getDataSource(dsid);
 		Connection conn = null;
@@ -156,7 +156,7 @@ public class DatasetService extends BaseCompService {
 			}
 		}
 	}
-	
+
 	public List<DSColumn> copyValue(ResultSet rs) throws SQLException{
 		ResultSetMetaData meta = rs.getMetaData();
 		List<DSColumn> cols = new ArrayList<DSColumn>();
@@ -183,28 +183,43 @@ public class DatasetService extends BaseCompService {
 		}
 		return cols;
 	}
-	
+
+	/**
+	 * java类型到 数据库类型
+	 * @param tp
+	 * @return
+	 */
 	public String columnType2java(String tp){
 		tp = tp.replaceAll(" UNSIGNED", ""); //mysql 存在 UNSIGNED 类型, 比如: INT UNSIGNED
 		String ret = null;
-		if("varchar".equalsIgnoreCase(tp) || "varchar2".equalsIgnoreCase(tp) || "nvarchar".equalsIgnoreCase(tp) || "char".equalsIgnoreCase(tp)){
+		if("varchar".equalsIgnoreCase(tp) || "bpchar".equalsIgnoreCase(tp) || "varchar2".equalsIgnoreCase(tp) || "nvarchar2".equalsIgnoreCase(tp) || "char".equalsIgnoreCase(tp) || "string".equalsIgnoreCase(tp)
+				|| tp.toLowerCase().indexOf("text") >= 0 || tp.toLowerCase().indexOf("string") >= 0 || tp.toLowerCase().indexOf("enum8") >= 0){
 			ret = "String";
-		}else if("int".equalsIgnoreCase(tp) || "MEDIUMINT".equalsIgnoreCase(tp) || "BIGINT".equalsIgnoreCase(tp) || "smallint".equalsIgnoreCase(tp) || "TINYINT".equalsIgnoreCase(tp)){
+		}else if("int".equalsIgnoreCase(tp) || "int4".equalsIgnoreCase(tp) || "float4".equalsIgnoreCase(tp) ||  "INTEGER".equalsIgnoreCase(tp) || "MEDIUMINT".equalsIgnoreCase(tp) || "smallint".equalsIgnoreCase(tp) || "TINYINT".equalsIgnoreCase(tp)
+				|| "BIT".equalsIgnoreCase(tp) || "UInt32".equalsIgnoreCase(tp) || "UInt8".equalsIgnoreCase(tp)){
 			ret = "Int";
-		}else if("number".equalsIgnoreCase(tp) || "DECIMAL".equalsIgnoreCase(tp) || "Float".equalsIgnoreCase(tp) || "Double".equalsIgnoreCase(tp)){
+		}else if( "int8".equalsIgnoreCase(tp) || "BIGINT".equalsIgnoreCase(tp)){
+			ret = "Long";
+		}else if("number".equalsIgnoreCase(tp) || "numeric".equalsIgnoreCase(tp) || "DECIMAL".equalsIgnoreCase(tp) || "Float".equalsIgnoreCase(tp) || "Double".equalsIgnoreCase(tp) || "REAL".equalsIgnoreCase(tp) || "dec".equalsIgnoreCase(tp)
+				|| "Float32".equalsIgnoreCase(tp)){
 			ret = "Double";
-		}else if("DATETIME".equalsIgnoreCase(tp) || "DATE".equalsIgnoreCase(tp) || "Timestamp".equalsIgnoreCase(tp)){
+		}else if("DATETIME".equalsIgnoreCase(tp) || "Timestamp".equalsIgnoreCase(tp)){
+			ret = "Datetime";
+		}else if("DATE".equalsIgnoreCase(tp)){
 			ret = "Date";
 		}
+		if(ret == null){
+			System.out.println("tp = " + tp+" 字段类型未映射成功");
+		}
 		return ret;
 	}
-	
+
 	/**
 	 * 查询数据集的字段
 	 * @param dataset
 	 * @param dsid
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	public List<DSColumn> queryMetaAndIncome(JSONObject dataset, String dsid) throws Exception{
 		DataSource ds = this.dsService.getDataSource(dsid);
@@ -217,7 +232,7 @@ public class DatasetService extends BaseCompService {
 		if(joinTabs!=null&&joinTabs.size() != 0){ //无关联表,不需要该字段
 			sb.append(",'' a$idx ");
 		}
-		
+
 		List<String> tabs = new ArrayList<String>(); //需要进行关联的表,从joininfo中获取,剔除重复的表
 		for(int i=0; joinTabs!=null&&i<joinTabs.size(); i++){
 			JSONObject join = joinTabs.getJSONObject(i);
@@ -226,7 +241,7 @@ public class DatasetService extends BaseCompService {
 				tabs.add(ref);
 			}
 		}
-		
+
 		for(int i=0; i<tabs.size(); i++){
 			sb.append(", a"+(i+1)+".* ");
 			if(i != tabs.size() - 1){
@@ -254,7 +269,7 @@ public class DatasetService extends BaseCompService {
 				sb.append(" ");
 			}
 		}
-		
+
 		Connection conn  = null;
 		try {
 			if(ds.getUse().equals("jndi")){
@@ -265,7 +280,7 @@ public class DatasetService extends BaseCompService {
 			PreparedStatement ps = conn.prepareStatement(sb.toString());
 			ps.setMaxRows(1);
 			ResultSet rs = ps.executeQuery();
-			
+
 			ResultSetMetaData meta = rs.getMetaData();
 			List<DSColumn> cols = new ArrayList<DSColumn>();
 			String tname = tables.get(0);
@@ -387,7 +402,7 @@ public class DatasetService extends BaseCompService {
 			}
 		}
 	}
-	
+
 	private List<JSONObject> getJoinInfoByTname(String tname, JSONArray joins){
 		List<JSONObject> ret = new ArrayList<JSONObject>();
 		for(int i=0; joins!=null&&i<joins.size(); i++){