Skip to content

Commit 2773d57

Browse files
author
chengyitian
committed
AJ-748: modify AutoFitTableAppender from 'append!' to 'tableInsert'; modify AutoFitTableUpsert upsert return table logic;
1 parent f5d14bd commit 2773d57

File tree

3 files changed

+138
-134
lines changed

3 files changed

+138
-134
lines changed

src/com/xxdb/DBConnection.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,6 @@ public void switchDataNode(Node node) throws IOException{
947947
}
948948

949949
if (nodes_.isEmpty()){
950-
log.error("com.xxdb.DBConnection.switchDataNode nodes_ is empty. Current node hostName: " + node.hostName + ", port: " + node.port);
951950
log.error("Connect to " + node.hostName + ":" + node.port + " failed.");
952951
throw new RuntimeException("Connect to " + node.hostName + ":" + node.port + " failed.");
953952
}

src/com/xxdb/route/AutoFitTableAppender.java

Lines changed: 97 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
import com.xxdb.DBConnection;
44
import com.xxdb.data.*;
5-
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
67
import java.io.IOException;
78
import java.time.LocalDate;
89
import java.util.ArrayList;
10+
import java.util.Arrays;
911
import java.util.List;
12+
import java.util.Objects;
1013

1114
public class AutoFitTableAppender {
1215
enum APPEND_ACTION {fitColumnType}
@@ -16,6 +19,8 @@ enum APPEND_ACTION {fitColumnType}
1619
DBConnection con_;
1720
APPEND_ACTION _action;
1821

22+
private static final Logger log = LoggerFactory.getLogger(AutoFitTableAppender.class);
23+
1924
public AutoFitTableAppender(String dbUrl, String tableName, DBConnection conn) {
2025
this.dbUrl_ = dbUrl;
2126
this.tableName_ = tableName;
@@ -30,98 +35,23 @@ public AutoFitTableAppender(String dbUrl, String tableName, DBConnection conn, A
3035
this._action = action;
3136
}
3237

33-
public String getDTString(Entity.DATA_TYPE type) {
34-
switch (type) {
35-
case DT_ANY:
36-
return "ANY";
37-
case DT_BLOB:
38-
return "BLOB";
39-
case DT_BOOL:
40-
return "BOOL";
41-
case DT_BYTE:
42-
return "BYTE";
43-
case DT_CODE:
44-
return "CODE";
45-
case DT_COMPRESS:
46-
return "COMPRESSED";
47-
case DT_DATASOURCE:
48-
return "DATASOURCE";
49-
case DT_DATE:
50-
return "DATE";
51-
case DT_DATEHOUR:
52-
return "DATEHOUR";
53-
case DT_DATEMINUTE:
54-
return "DATEMINUTE";
55-
case DT_DATETIME:
56-
return "DATETIME";
57-
case DT_DICTIONARY:
58-
return "DICTIONARY";
59-
case DT_DOUBLE:
60-
return "DOUBLE";
61-
case DT_FLOAT:
62-
return "FLOAT";
63-
case DT_FUNCTIONDEF:
64-
return "FUNCTIONDEF";
65-
case DT_HANDLE:
66-
return "HANDLE";
67-
case DT_INT:
68-
return "INT";
69-
case DT_INT128:
70-
return "INT128";
71-
case DT_IPADDR:
72-
return "IPADDR";
73-
case DT_LONG:
74-
return "LONG";
75-
case DT_MINUTE:
76-
return "MINUTE";
77-
case DT_MONTH:
78-
return "MONTH";
79-
case DT_NANOTIME:
80-
return "NANOTIME";
81-
case DT_NANOTIMESTAMP:
82-
return "NANOTIMESTAMP";
83-
case DT_OBJECT:
84-
return "OBJECT";
85-
case DT_STRING:
86-
return "STRING";
87-
case DT_RESOURCE:
88-
return "RESOURCE";
89-
case DT_SECOND:
90-
return "SECOND";
91-
case DT_SHORT:
92-
return "SHORT";
93-
case DT_SYMBOL:
94-
return "SYMBOL";
95-
case DT_TIME:
96-
return "TIME";
97-
case DT_TIMESTAMP:
98-
return "TIMESTAMP";
99-
case DT_UUID:
100-
return "UUID";
101-
case DT_VOID:
102-
return "VOID";
103-
}
104-
return "Unrecognized type";
105-
}
106-
10738
public Entity append(BasicTable table) {
108-
Entity ret=new BasicBoolean(false);
39+
Entity res = null;
10940
try {
11041
String runScript;
111-
if(dbUrl_=="")
42+
if(Objects.equals(dbUrl_, ""))
11243
runScript="schema(" + tableName_ + ")";
11344
else
11445
runScript="schema(loadTable(\"" + dbUrl_ + "\",\"" + tableName_ + "\"))";
115-
ret = con_.run(runScript);
46+
47+
Entity schema = con_.run(runScript);
11648
int columns = table.columns();
117-
BasicTable schema = (BasicTable)((BasicDictionary)ret).get(new BasicString("colDefs"));
118-
BasicStringVector typeList = (BasicStringVector) schema.getColumn("typeString");
119-
BasicStringVector nameList = (BasicStringVector) schema.getColumn("name");
120-
List<String> colName = new ArrayList<>();
49+
BasicTable colDefs = (BasicTable) ((BasicDictionary) schema).get(new BasicString("colDefs"));
50+
BasicStringVector typeList = (BasicStringVector) colDefs.getColumn("typeString");
51+
BasicStringVector nameList = (BasicStringVector) colDefs.getColumn("name");
52+
List<String> colName = Arrays.asList(nameList.getValues());
12153
List<Vector> cols = new ArrayList<>();
122-
for(int i=0;i<columns;++i){
123-
colName.add(nameList.getString(i));
124-
}
54+
12555
int rowSize = table.rows();
12656
for (int i = 0; i < columns; ++i) {
12757
String name = nameList.getString(i);
@@ -476,15 +406,90 @@ public Entity append(BasicTable table) {
476406
List<Entity> param = new ArrayList<Entity>();
477407
BasicTable paramTable = new BasicTable(colName, cols);
478408
param.add(paramTable);
479-
if(dbUrl_=="")
480-
ret = con_.run("append!{" + tableName_ + "}", param);
409+
if(Objects.equals(dbUrl_, ""))
410+
res = con_.run("tableInsert{" + tableName_ + "}", param);
481411
else
482-
ret = con_.run("append!{loadTable(\"" + dbUrl_ + "\",\"" + tableName_ + "\"), }", param);
483-
} catch (InterruptedException e) {
484-
e.printStackTrace();
485-
} catch (IOException e) {
412+
res = con_.run("tableInsert{loadTable(\"" + dbUrl_ + "\",\"" + tableName_ + "\"), }", param);
413+
} catch (InterruptedException | IOException e) {
486414
e.printStackTrace();
487415
}
488-
return ret;
416+
417+
log.info("AutoFitTableAppender.append() insert value rows: " + res.getString() + ".");
418+
return res;
419+
}
420+
421+
public String getDTString(Entity.DATA_TYPE type) {
422+
switch (type) {
423+
case DT_ANY:
424+
return "ANY";
425+
case DT_BLOB:
426+
return "BLOB";
427+
case DT_BOOL:
428+
return "BOOL";
429+
case DT_BYTE:
430+
return "BYTE";
431+
case DT_CODE:
432+
return "CODE";
433+
case DT_COMPRESS:
434+
return "COMPRESSED";
435+
case DT_DATASOURCE:
436+
return "DATASOURCE";
437+
case DT_DATE:
438+
return "DATE";
439+
case DT_DATEHOUR:
440+
return "DATEHOUR";
441+
case DT_DATEMINUTE:
442+
return "DATEMINUTE";
443+
case DT_DATETIME:
444+
return "DATETIME";
445+
case DT_DICTIONARY:
446+
return "DICTIONARY";
447+
case DT_DOUBLE:
448+
return "DOUBLE";
449+
case DT_FLOAT:
450+
return "FLOAT";
451+
case DT_FUNCTIONDEF:
452+
return "FUNCTIONDEF";
453+
case DT_HANDLE:
454+
return "HANDLE";
455+
case DT_INT:
456+
return "INT";
457+
case DT_INT128:
458+
return "INT128";
459+
case DT_IPADDR:
460+
return "IPADDR";
461+
case DT_LONG:
462+
return "LONG";
463+
case DT_MINUTE:
464+
return "MINUTE";
465+
case DT_MONTH:
466+
return "MONTH";
467+
case DT_NANOTIME:
468+
return "NANOTIME";
469+
case DT_NANOTIMESTAMP:
470+
return "NANOTIMESTAMP";
471+
case DT_OBJECT:
472+
return "OBJECT";
473+
case DT_STRING:
474+
return "STRING";
475+
case DT_RESOURCE:
476+
return "RESOURCE";
477+
case DT_SECOND:
478+
return "SECOND";
479+
case DT_SHORT:
480+
return "SHORT";
481+
case DT_SYMBOL:
482+
return "SYMBOL";
483+
case DT_TIME:
484+
return "TIME";
485+
case DT_TIMESTAMP:
486+
return "TIMESTAMP";
487+
case DT_UUID:
488+
return "UUID";
489+
case DT_VOID:
490+
return "VOID";
491+
}
492+
493+
return "Unrecognized type";
489494
}
490495
}

src/com/xxdb/route/AutoFitTableUpsert.java

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.xxdb.DBConnection;
44
import com.xxdb.data.*;
5-
65
import java.io.IOException;
76
import java.util.ArrayList;
87
import java.util.List;
@@ -19,44 +18,17 @@ public AutoFitTableUpsert(String dbUrl, String tableName, DBConnection connectio
1918
connection_ = connection;
2019
BasicTable colDefs;
2120
BasicIntVector colTypesInt;
22-
BasicDictionary tableInfo;
21+
BasicDictionary schema;
2322
BasicStringVector colNames;
2423
try {
25-
String task;
26-
if (dbUrl.equals("")){
27-
task = "schema(" + tableName+ ")";
28-
upsertScript_ = "upsert!{" + tableName + "";
29-
}else {
30-
task = "schema(loadTable(\"" + dbUrl + "\", \"" + tableName + "\"))";
31-
upsertScript_ = "upsert!{loadTable('" + dbUrl + "', '" + tableName + "')";
32-
}
33-
upsertScript_+=",";
34-
if(!ignoreNull)
35-
upsertScript_+=",ignoreNull=false";
24+
this.upsertScript_ = defineInsertScript(dbUrl,tableName, ignoreNull, pkeyColNames, psortColumns);
25+
String runSchemaScript;
26+
if (dbUrl.equals(""))
27+
runSchemaScript = "schema(" + tableName+ ")";
3628
else
37-
upsertScript_+=",ignoreNull=true";
38-
int ignoreParamCount=0;
39-
if (pkeyColNames != null && pkeyColNames.length > 0){
40-
upsertScript_+=",keyColNames=";
41-
for (String one : pkeyColNames){
42-
upsertScript_ += "`"+one;
43-
}
44-
}else {
45-
ignoreParamCount++;
46-
}
47-
if (psortColumns != null && psortColumns.length > 0){
48-
while (ignoreParamCount > 0){
49-
upsertScript_ += ",";
50-
ignoreParamCount--;
51-
}
52-
upsertScript_ += ",sortColumns=";
53-
for (String one : psortColumns){
54-
upsertScript_ += "`"+one;
55-
}
56-
}
57-
upsertScript_+="}";
58-
tableInfo = (BasicDictionary) connection_.run(task);
59-
colDefs = (BasicTable) tableInfo.get(new BasicString("colDefs"));
29+
runSchemaScript = "schema(loadTable(\"" + dbUrl + "\", \"" + tableName + "\"))";
30+
schema = (BasicDictionary) connection_.run(runSchemaScript);
31+
colDefs = (BasicTable) schema.get(new BasicString("colDefs"));
6032
cols_ = colDefs.rows();
6133
colTypesInt = (BasicIntVector) colDefs.getColumn("typeInt");
6234
colNames = (BasicStringVector) colDefs.getColumn("name");
@@ -65,7 +37,7 @@ public AutoFitTableUpsert(String dbUrl, String tableName, DBConnection connectio
6537
columnCategories_.add(Utils.getCategory(columnTypes_.get(i)));
6638
colNames_.add(colNames.getString(i));
6739
}
68-
}catch (IOException e){
40+
} catch (IOException e){
6941
throw e;
7042
}
7143
}
@@ -87,10 +59,38 @@ public int upsert(BasicTable table) throws Exception{
8759
List<Entity> args = new ArrayList<>();
8860
args.add(tableToInsert);
8961
Entity res = connection_.run(upsertScript_, args);
90-
if (res.getDataType() == Entity.DATA_TYPE.DT_INT && res.getDataForm() == Entity.DATA_FORM.DF_SCALAR){
91-
return ((BasicInt) res).getInt();
92-
}else
93-
return 0;
62+
63+
return ((BasicInt) res).getInt();
64+
}
65+
66+
private String defineInsertScript (String dbUrl, String tableName, boolean ignoreNull, String[] pkeyColNames, String[] psortColumns) {
67+
StringBuilder script = new StringBuilder("(def(mutable tb, data){upsert!(tb, data");
68+
69+
if (!ignoreNull)
70+
script.append(",ignoreNull=false");
71+
else
72+
script.append(",ignoreNull=true");
73+
74+
if (pkeyColNames != null && pkeyColNames.length > 0) {
75+
script.append(",keyColNames=");
76+
for (String colName : pkeyColNames)
77+
script.append("`").append(colName);
78+
}
79+
80+
if (psortColumns != null && psortColumns.length > 0) {
81+
script.append(",sortColumns=");
82+
for (String colName : psortColumns)
83+
script.append("`").append(colName);
84+
}
85+
86+
script.append(");return 0;}){");
87+
88+
if (dbUrl == null || dbUrl.isEmpty())
89+
script.append(tableName).append("}");
90+
else
91+
script.append("loadTable('").append(dbUrl).append("','").append(tableName).append("')}");
92+
93+
return script.toString();
9494
}
9595

9696
private void checkColumnType(int col, Entity.DATA_CATEGORY category, Entity.DATA_TYPE type){

0 commit comments

Comments
 (0)