001
002package gudusoft.gsqlparser.dlineage.dataflow.model;
003
004import gudusoft.gsqlparser.EDbVendor;
005import gudusoft.gsqlparser.ESqlStatementType;
006import gudusoft.gsqlparser.ETableSource;
007import gudusoft.gsqlparser.TCustomSqlStatement;
008import gudusoft.gsqlparser.dlineage.util.DlineageUtil;
009import gudusoft.gsqlparser.dlineage.util.Objects;
010import gudusoft.gsqlparser.dlineage.util.Pair;
011import gudusoft.gsqlparser.nodes.TAliasClause;
012import gudusoft.gsqlparser.nodes.TCaseExpression;
013import gudusoft.gsqlparser.nodes.TConstant;
014import gudusoft.gsqlparser.nodes.TDeclareVariable;
015import gudusoft.gsqlparser.nodes.TExpression;
016import gudusoft.gsqlparser.nodes.TFunctionCall;
017import gudusoft.gsqlparser.nodes.TObjectName;
018import gudusoft.gsqlparser.nodes.TObjectNameList;
019import gudusoft.gsqlparser.nodes.TParameterDeclaration;
020import gudusoft.gsqlparser.nodes.TParseTreeNode;
021import gudusoft.gsqlparser.nodes.TPivotClause;
022import gudusoft.gsqlparser.nodes.TResultColumn;
023import gudusoft.gsqlparser.nodes.TTable;
024import gudusoft.gsqlparser.nodes.TWhenClauseItemList;
025import gudusoft.gsqlparser.sqlenv.TSQLColumn;
026import gudusoft.gsqlparser.sqlenv.TSQLEnv;
027import gudusoft.gsqlparser.sqlenv.TSQLTable;
028import gudusoft.gsqlparser.stmt.TCreateTableSqlStatement;
029import gudusoft.gsqlparser.stmt.TCreateViewSqlStatement;
030import gudusoft.gsqlparser.stmt.TCursorDeclStmt;
031import gudusoft.gsqlparser.stmt.TForStmt;
032import gudusoft.gsqlparser.stmt.TInsertSqlStatement;
033import gudusoft.gsqlparser.stmt.TLoopStmt;
034import gudusoft.gsqlparser.stmt.TMergeSqlStatement;
035import gudusoft.gsqlparser.stmt.TOpenforStmt;
036import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
037import gudusoft.gsqlparser.stmt.TStoredProcedureSqlStatement;
038import gudusoft.gsqlparser.stmt.mssql.TMssqlDeclare;
039import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreatePackage;
040import gudusoft.gsqlparser.util.SQLUtil;
041
042import java.util.ArrayList;
043import java.util.LinkedHashMap;
044import java.util.List;
045import java.util.Map;
046import java.util.Set;
047
048public class ModelFactory {
049
050        private ModelBindingManager modelManager;
051
052        public ModelFactory(ModelBindingManager modelManager) {
053                this.modelManager = modelManager;
054        }
055
056        public ResultSet createResultSet(TSelectSqlStatement select, boolean isTarget) {
057                if (select.getResultColumnList() != null) {
058                        if (modelManager.getModel(select.getResultColumnList()) instanceof ResultSet) {
059                                return (ResultSet) modelManager.getModel(select.getResultColumnList());
060                        }
061                        SelectResultSet resultSet = new SelectResultSet(select, isTarget);
062                        modelManager.bindModel(select.getResultColumnList(), resultSet);
063                        return resultSet;
064                } else if (select.getTransformClause() != null) {
065                        if (modelManager.getModel(select.getTransformClause()) instanceof ResultSet) {
066                                return (ResultSet) modelManager.getModel(select.getTransformClause());
067                        }
068                        SelectResultSet resultSet = new SelectResultSet(select, isTarget);
069                        modelManager.bindModel(select.getTransformClause(), resultSet);
070                        return resultSet;
071                } else
072                        return null;
073        }
074
075        public ResultSet createResultSet(TParseTreeNode gspObject, boolean isTarget) {
076                if (modelManager.getModel(gspObject) instanceof ResultSet) {
077                        return (ResultSet) modelManager.getModel(gspObject);
078                }
079                ResultSet resultSet = new ResultSet(gspObject, isTarget);
080                modelManager.bindModel(gspObject, resultSet);
081                return resultSet;
082        }
083
084        public ResultColumn createResultColumn(ResultSet resultSet, TResultColumn resultColumn) {
085                if (modelManager.getModel(resultColumn) instanceof ResultColumn) {
086                        return (ResultColumn) modelManager.getModel(resultColumn);
087                }
088                ResultColumn column = new ResultColumn(resultSet, resultColumn);
089                modelManager.bindModel(resultColumn, column);
090                return column;
091        }
092
093        public ResultColumn createStarResultColumn(ResultSet resultSetModel, TResultColumn resultColumn,
094                        String refColumnName) {
095                if (modelManager.getModel(resultColumn) instanceof LinkedHashMap) {
096                        LinkedHashMap<String, ResultColumn> resultColumns = (LinkedHashMap<String, ResultColumn>) modelManager
097                                        .getModel(resultColumn);
098                        if (resultColumns.containsKey(refColumnName)) {
099                                return resultColumns.get(refColumnName);
100                        }
101
102                        ResultColumn column = new ResultColumn(resultSetModel, resultColumn, refColumnName);
103                        resultColumns.put(refColumnName, column);
104                        return column;
105                } else {
106                        LinkedHashMap<String, ResultColumn> resultColumns = new LinkedHashMap<String, ResultColumn>();
107                        ResultColumn column = new ResultColumn(resultSetModel, resultColumn, refColumnName);
108                        resultColumns.put(refColumnName, column);
109                        modelManager.bindModel(resultColumn, resultColumns);
110                        return column;
111                }
112        }
113
114        public ResultColumn createSelectSetResultColumn(ResultSet resultSet, ResultColumn resultColumn) {
115                if (modelManager.getModel(resultColumn) instanceof ResultColumn) {
116                        return (ResultColumn) modelManager.getModel(resultColumn);
117                }
118                String columnName = DlineageUtil.getIdentifierNormalColumnName(resultColumn.getName());
119                for (int i = 0; i < resultSet.getColumns().size(); i++) {
120                        ResultColumn columnModel = resultSet.getColumns().get(i);
121                        if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals(columnName)) {
122                                modelManager.bindModel(resultColumn, columnModel);
123                                return columnModel;
124                        }
125                }
126                ResultColumn column = new SelectSetResultColumn(resultSet, resultColumn);
127                if(resultColumn.isStruct()) {
128                        column.setStruct(true);
129                }
130                modelManager.bindModel(resultColumn, column);
131                return column;
132        }
133
134        public ResultColumn createSelectSetResultColumn(ResultSet resultSet, TResultColumn resultColumn, int index) {
135                
136                for (int i = 0; i < resultSet.getColumns().size(); i++) {
137                        ResultColumn columnModel = resultSet.getColumns().get(i);
138                        if(columnModel.getColumnObject() == resultColumn) {
139                                return columnModel;
140                        }
141                }
142                
143                SelectSetResultColumn column = new SelectSetResultColumn(resultSet, resultColumn, index);
144                modelManager.bindModel(resultColumn, column);
145                return column;
146        }
147
148        public ResultColumn createAndBindingSelectSetResultColumn(ResultSet resultSet, TResultColumn resultColumn,
149                        int index) {
150                if (modelManager.getModel(resultColumn) instanceof ResultColumn) {
151                        return (ResultColumn) modelManager.getModel(resultColumn);
152                }
153                ResultColumn column = new SelectSetResultColumn(resultSet, resultColumn, index);
154                modelManager.bindModel(resultColumn, column);
155                return column;
156        }
157
158        public ResultColumn createResultColumn(ResultSet resultSet, TObjectName resultColumn) {
159                if (modelManager.getModel(resultColumn) instanceof ResultColumn) {
160                        return (ResultColumn) modelManager.getModel(resultColumn);
161                }
162                if(EDbVendor.dbvoracle == ModelBindingManager.getGlobalVendor()){
163                        ResultColumn column = new ResultColumn(resultSet, resultColumn);
164                        modelManager.bindModel(resultColumn, column);
165                        return column;
166                }
167                else {
168                        String columnName = DlineageUtil.getIdentifierNormalColumnName(resultColumn.toString());
169                        for (int i = 0; i < resultSet.getColumns().size(); i++) {
170                                ResultColumn columnModel = resultSet.getColumns().get(i);
171                                if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals(columnName)) {
172                                        modelManager.bindModel(resultColumn, columnModel);
173                                        return columnModel;
174                                }
175                        }
176                        ResultColumn column = new ResultColumn(resultSet, resultColumn);
177                        modelManager.bindModel(resultColumn, column);
178                        return column;
179                }
180        }
181
182        public ResultColumn createResultColumn(ResultSet resultSet, TExpression expression) {
183                if (modelManager.getModel(expression) instanceof ResultColumn) {
184                        return (ResultColumn) modelManager.getModel(expression);
185                }
186                ResultColumn column = new ResultColumn(resultSet, expression);
187                modelManager.bindModel(expression, column);
188                return column;
189        }
190
191        public ResultColumn createResultColumn(ResultSet resultSet, TObjectName resultColumn, boolean forceCreate) {
192                if (!forceCreate) {
193                        if (modelManager.getModel(resultColumn) instanceof ResultColumn) {
194                                return (ResultColumn) modelManager.getModel(resultColumn);
195                        }
196                }
197
198                String columnName = DlineageUtil.getIdentifierNormalColumnName(resultColumn.toString());
199                for (int i = 0; i < resultSet.getColumns().size(); i++) {
200                        ResultColumn columnModel = resultSet.getColumns().get(i);
201                        if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals(columnName)) {
202                                modelManager.bindModel(resultColumn, columnModel);
203                                return columnModel;
204                        }
205                }
206
207                ResultColumn column = new ResultColumn(resultSet, resultColumn);
208                modelManager.bindModel(resultColumn, column);
209                return column;
210        }
211
212        public FunctionResultColumn createFunctionResultColumn(Function function, TObjectName functionName) {
213                if (modelManager.getModel(functionName) instanceof FunctionResultColumn) {
214                        return (FunctionResultColumn) modelManager.getModel(functionName);
215                }
216                FunctionResultColumn column = new FunctionResultColumn(function, function.getFunctionObject(), functionName);
217                modelManager.bindModel(functionName, column);
218                return column;
219        }
220
221        public FunctionResultColumn createFunctionResultColumn(Function function, TWhenClauseItemList caseFunction) {
222                if (modelManager.getModel(caseFunction) instanceof FunctionResultColumn) {
223                        return (FunctionResultColumn) modelManager.getModel(caseFunction);
224                }
225                FunctionResultColumn column = new FunctionResultColumn(function, function.getFunctionObject(), caseFunction);
226                modelManager.bindModel(caseFunction, column);
227                return column;
228        }
229
230        public ResultColumn createMergeResultColumn(ResultSet resultSet, TObjectName resultColumn) {
231                if (modelManager.getMergeModel(resultColumn) instanceof ResultColumn) {
232                        return (ResultColumn) modelManager.getMergeModel(resultColumn);
233                }
234                ResultColumn column = new ResultColumn(resultSet, resultColumn);
235                modelManager.bindMergeModel(resultColumn, column);
236                return column;
237        }
238
239        public ResultColumn createUpdateResultColumn(ResultSet resultSet, TObjectName resultColumn) {
240                if (modelManager.getUpdateModel(resultColumn) instanceof ResultColumn) {
241                        return (ResultColumn) modelManager.getUpdateModel(resultColumn);
242                }
243                ResultColumn column = new ResultColumn(resultSet, resultColumn);
244                modelManager.bindUpdateModel(resultColumn, column);
245                return column;
246        }
247
248        public ResultColumn createResultColumn(QueryTable queryTableModel, TResultColumn resultColumn) {
249                if (modelManager.getModel(resultColumn) instanceof ResultColumn) {
250                        return (ResultColumn) modelManager.getModel(resultColumn);
251                }
252                ResultColumn column = new ResultColumn(queryTableModel, resultColumn);
253                modelManager.bindModel(resultColumn, column);
254                return column;
255        }
256        
257        public Table createTableFromCreateDDL(TTable table, boolean fromDDL, String tableName) {
258                if (modelManager.getCreateModel(table) instanceof Table) {
259                        return (Table) modelManager.getCreateModel(table);
260                }
261                if (modelManager.getModel(table) instanceof Table) {
262                        return (Table) modelManager.getModel(table);
263                }
264                if (modelManager
265                                .getTableByName(DlineageUtil.getTableFullName(tableName.toString())) instanceof Table) {
266                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(tableName.toString()));
267                }
268                if (modelManager.getTableByName(
269                                DlineageUtil.getTableFullNameWithDefaultSchema(tableName.toString())) instanceof Table) {
270                        return (Table) modelManager
271                                        .getTableByName(DlineageUtil.getTableFullNameWithDefaultSchema(tableName.toString()));
272                }
273                Table tableModel = new Table(table, tableName);
274                tableModel.setCreateTable(fromDDL);
275                if (!fromDDL) {
276                        Table existTable = modelManager.getTableByName(DlineageUtil.getTableFullName(tableModel.getName()));
277                        if (existTable != null) {
278                                return existTable;
279                        }
280                }
281                modelManager.bindCreateModel(table, tableModel);
282                if(table.getTableType() == ETableSource.unnest) {
283                        
284                }
285                else {
286                        modelManager.bindTableByName(DlineageUtil.getTableFullName(tableName.toString()), tableModel);
287                }
288                return tableModel;
289        }
290
291        public Table createTableFromCreateDDL(TTable table, boolean fromDDL) {
292                if (modelManager.getCreateModel(table) instanceof Table) {
293                        return (Table) modelManager.getCreateModel(table);
294                }
295                if (modelManager.getModel(table) instanceof Table) {
296                        return (Table) modelManager.getModel(table);
297                }
298                if (modelManager
299                                .getTableByName(DlineageUtil.getTableFullName(table.getTableName().toString())) instanceof Table) {
300                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(table.getTableName().toString()));
301                }
302                if (modelManager.getTableByName(
303                                DlineageUtil.getTableFullNameWithDefaultSchema(table.getTableName().toString())) instanceof Table) {
304                        return (Table) modelManager
305                                        .getTableByName(DlineageUtil.getTableFullNameWithDefaultSchema(table.getTableName().toString()));
306                }
307                Table tableModel = new Table(table);
308                tableModel.setCreateTable(fromDDL, fromDDL);
309                if (!fromDDL) {
310                        Table existTable = modelManager.getTableByName(DlineageUtil.getTableFullName(tableModel.getName()));
311                        if (existTable != null) {
312                                return existTable;
313                        }
314                }
315                modelManager.bindCreateModel(table, tableModel);
316                modelManager.bindTableByName(DlineageUtil.getTableFullName(table.getTableName().toString()), tableModel);
317                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableModel.getName()), tableModel);
318                return tableModel;
319        }
320
321        public Table createJsonTable(TTable table) {
322                String tableName = table.toString();
323                if (tableName.toLowerCase().indexOf("with") != -1) {
324                        tableName = table.toString().substring(0, tableName.toLowerCase().indexOf("with")).trim();
325                }
326
327                if (table.isLinkTable()) {
328                        table = table.getLinkTable();
329                }
330
331                if (modelManager.getCreateTable(table) != null) {
332                        return modelManager.getCreateTable(table);
333                }
334                if (modelManager.getModel(table) instanceof Table) {
335                        return (Table) modelManager.getModel(table);
336                }
337                if (modelManager.getTableByName(DlineageUtil.getTableFullName(tableName)) instanceof Table) {
338                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(tableName));
339                }
340
341                if (modelManager.getTableByName(DlineageUtil.getTableFullNameWithDefaultSchema(tableName)) instanceof Table) {
342                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullNameWithDefaultSchema(tableName));
343                }
344
345                Table tableModel = new Table(table);
346                tableModel.setName(tableName);
347                modelManager.bindModel(table, tableModel);
348                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableName), tableModel);
349                return tableModel;
350        }
351
352        public Table createTable(TTable table, TObjectName tableBinding) {
353                Table tableModel = createTable(table);
354                modelManager.bindModel(table, tableModel);
355                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableBinding.toString()), tableModel);
356                return tableModel;
357        }
358
359        public Table createTable(TTable table) {
360                if (table.isLinkTable()) {
361                        table = table.getLinkTable();
362                }
363
364                Table tableModel = null;
365                if (modelManager.getCreateTable(table) != null) {
366                        tableModel = modelManager.getCreateTable(table);
367                }
368                if (tableModel == null && modelManager.getModel(table) instanceof Table) {
369                        tableModel = (Table) modelManager.getModel(table);
370                }
371
372                String tableName = table.getTableName().toString();
373                if (table.getSubquery() != null && table.getAliasClause() != null) {
374                        tableName = table.getAliasClause().toString();
375                }
376
377                if (tableModel == null
378                                && modelManager.getTableByName(DlineageUtil.getTableFullName(tableName)) instanceof Table) {
379                        tableModel = modelManager.getTableByName(DlineageUtil.getTableFullName(tableName));
380                }
381
382                if (tableModel == null && modelManager
383                                .getTableByName(DlineageUtil.getTableFullNameWithDefaultSchema(tableName)) instanceof Table) {
384                        tableModel = modelManager.getTableByName(DlineageUtil.getTableFullNameWithDefaultSchema(tableName));
385                }
386
387                if (tableModel != null) {
388                        if (table.getAliasClause() != null) {
389                                tableModel.setAlias(table.getAliasName());
390                        }
391                        tableModel.setCurrentAlias(table.getAliasName());
392                        modelManager.updateTableAliasMap(table);
393                        return tableModel;
394                }
395
396                tableModel = new Table(table);
397                Table existTable = modelManager.getTableByName(DlineageUtil.getTableFullName(tableModel.getName()));
398                if (existTable != null) {
399                        return existTable;
400                }
401                modelManager.bindModel(table, tableModel);
402                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableName), tableModel);
403                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableModel.getName()), tableModel);
404
405                appendTableColumns(tableModel);
406
407                return tableModel;
408        }
409
410        protected void appendTableColumns(Table tableModel) {
411                TCustomSqlStatement stmt = ModelBindingManager.getGlobalStmtStack().peek();
412                if (stmt instanceof TCreateTableSqlStatement || stmt instanceof TCreateViewSqlStatement) {
413                        return;
414                }
415                if (stmt instanceof TInsertSqlStatement && ((TInsertSqlStatement) stmt).getColumnList() != null) {
416                        return;
417                }
418                if (ModelBindingManager.getGlobalSQLEnv() != null) {
419                        ArrayList<String> columns = ModelBindingManager.getGlobalSQLEnv()
420                                        .getColumnsInTable(DlineageUtil.getTableFullName(tableModel.getName()), true);
421                        if (columns != null && !columns.isEmpty()) {
422                                for (String column : columns) {
423                                        if (SQLUtil.isEmpty(column)) {
424                                                continue;
425                                        }
426                                        createInsertTableColumn(tableModel, column);
427                                }
428                                tableModel.setFromDDL(true);
429                                tableModel.setCreateTable(true);
430                        }
431                }
432        }
433
434        public Table createTriggerOnTable(TTable table) {
435                if (modelManager.getCreateTable(table) != null) {
436                        return modelManager.getCreateTable(table);
437                }
438                if (modelManager.getModel(table) instanceof Table) {
439                        return (Table) modelManager.getModel(table);
440                }
441                if (modelManager
442                                .getTableByName(DlineageUtil.getTableFullName(table.getTableName().toString())) instanceof Table) {
443                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(table.getTableName().toString()));
444                }
445                if (modelManager.getTableByName(
446                                DlineageUtil.getTableFullNameWithDefaultSchema(table.getTableName().toString())) instanceof Table) {
447                        return (Table) modelManager
448                                        .getTableByName(DlineageUtil.getTableFullNameWithDefaultSchema(table.getTableName().toString()));
449                }
450                Table tableModel = new Table(table);
451                Table existTable = modelManager.getTableByName(DlineageUtil.getTableFullName(tableModel.getName()));
452                if (existTable != null) {
453                        return existTable;
454                }
455                modelManager.bindModel(table, tableModel);
456                modelManager.bindTableByName(DlineageUtil.getTableFullName(table.getTableName().toString()), tableModel);
457                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableModel.getName()), tableModel);
458                return tableModel;
459        }
460
461        public Table createTableByName(TObjectName tableName) {
462                return createTableByName(tableName, false);
463        }
464
465        public Table createTableByName(TObjectName tableName, boolean create) {
466                if (modelManager.getTableByName(DlineageUtil.getTableFullName(tableName.toString())) instanceof Table) {
467                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(tableName.toString()));
468                }
469                Table tableModel = new Table(tableName);
470                Table existTable = modelManager.getTableByName(DlineageUtil.getTableFullName(tableModel.getName()));
471                if (existTable != null) {
472                        return existTable;
473                }
474                if (tableModel.getColumns() == null || tableModel.getColumns().isEmpty()) {
475                        tableModel.addColumnsFromSQLEnv();
476                }
477                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableName.toString()), tableModel);
478                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableModel.getName()), tableModel);
479                if (create) {
480                        modelManager.bindCreateModel(tableName, tableModel);
481                }
482                return tableModel;
483        }
484
485        public Table createTableByName(String tableName, boolean create) {
486                if (modelManager.getTableByName(DlineageUtil.getTableFullName(tableName.toString())) instanceof Table) {
487                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(tableName.toString()));
488                }
489                Table tableModel = new Table(tableName);
490                Table existTable = modelManager.getTableByName(DlineageUtil.getTableFullName(tableModel.getName()));
491                if (existTable != null) {
492                        return existTable;
493                }
494                if (tableModel.getColumns() == null || tableModel.getColumns().isEmpty()) {
495                        tableModel.addColumnsFromSQLEnv();
496                }
497                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableName.toString()), tableModel);
498                modelManager.bindTableByName(DlineageUtil.getTableFullName(tableModel.getName()), tableModel);
499                if (create) {
500                        modelManager.bindCreateModel(tableName, tableModel);
501                }
502                return tableModel;
503        }
504
505        public Table createStage(TObjectName stageName) {
506                if (modelManager.getTableByName(DlineageUtil.getTableFullName(stageName.toString())) instanceof Table) {
507                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(stageName.toString()));
508                }
509                Table tableModel = new Table(stageName);
510                modelManager.bindTableByName(DlineageUtil.getTableFullName(stageName.toString()), tableModel);
511                modelManager.bindCreateModel(stageName, tableModel);
512
513                TObjectName stageVariableName = new TObjectName();
514                stageVariableName.setString("@" + stageName.getColumnNameOnly());
515                modelManager.bindCreateModel(stageVariableName, tableModel);
516
517                return tableModel;
518        }
519
520        public Table createDataSource(TObjectName dataSourceName) {
521                if (modelManager.getTableByName(DlineageUtil.getTableFullName(dataSourceName.toString())) instanceof Table) {
522                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(dataSourceName.toString()));
523                }
524                Table tableModel = new Table(dataSourceName);
525                tableModel.setDataSource(true);
526                modelManager.bindTableByName(DlineageUtil.getTableFullName(dataSourceName.toString()), tableModel);
527                modelManager.bindCreateModel(dataSourceName, tableModel);
528
529                return tableModel;
530        }
531
532        public Table createStream(TObjectName streamName) {
533                if (modelManager.getTableByName(DlineageUtil.getTableFullName(streamName.toString())) instanceof Table) {
534                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(streamName.toString()));
535                }
536                Table tableModel = new Table(streamName);
537                tableModel.setStream(true);
538                modelManager.bindTableByName(DlineageUtil.getTableFullName(streamName.toString()), tableModel);
539                modelManager.bindCreateModel(streamName, tableModel);
540                return tableModel;
541        }
542
543        public Table createConstantsTable(TCustomSqlStatement stmt) {
544                stmt = DlineageUtil.getTopStmt(stmt);
545                String sqlHash = String.valueOf(stmt.hashCode());
546                if (modelManager.getTableByName(sqlHash) instanceof Table) {
547                        return (Table) modelManager.getTableByName(sqlHash);
548                }
549                Table tableModel = new Table("SQL_CONSTANTS");
550                tableModel.setConstant(true);
551                modelManager.bindTableByName(sqlHash, tableModel);
552                modelManager.bindCreateModel(sqlHash, tableModel);
553                return tableModel;
554        }
555        
556        public Table createConstantsTable(String sqlHash) {
557                if (modelManager.getTableByName(sqlHash) instanceof Table) {
558                        return (Table) modelManager.getTableByName(sqlHash);
559                }
560                Table tableModel = new Table("SQL_CONSTANTS");
561                tableModel.setConstant(true);
562                modelManager.bindTableByName(sqlHash, tableModel);
563                modelManager.bindCreateModel(sqlHash, tableModel);
564                return tableModel;
565        }
566
567        public Table createJsonVariable(TObjectName jsonVariable) {
568                if (modelManager.getTableByName(DlineageUtil.getTableFullName(jsonVariable.toString())) instanceof Table) {
569                        return (Table) modelManager.getTableByName(DlineageUtil.getTableFullName(jsonVariable.toString()));
570                }
571                Table tableModel = new Table(jsonVariable);
572                modelManager.bindTableByName(DlineageUtil.getTableFullName(jsonVariable.toString()), tableModel);
573                modelManager.bindCreateModel(jsonVariable, tableModel);
574
575                modelManager.bindCreateModel(jsonVariable, tableModel);
576
577                return tableModel;
578        }
579
580        public Alias createAlias(TAliasClause aliasClause) {
581                if (modelManager.getModel(aliasClause) instanceof Alias) {
582                        return (Alias) modelManager.getModel(aliasClause);
583                }
584
585                Alias alias = new Alias(aliasClause);
586                modelManager.bindModel(aliasClause, alias);
587
588                return alias;
589        }
590
591        public Function createFunction(TFunctionCall functionCall) {
592                if (modelManager.getModel(functionCall) instanceof Function) {
593                        return (Function) modelManager.getModel(functionCall);
594                }
595
596                Function function = new Function(functionCall);
597                function.setDetermined(false);
598                modelManager.bindModel(functionCall, function);
599
600                return function;
601        }
602
603        public Function createFunction(TObjectName functionName) {
604                if (modelManager.getModel(functionName) instanceof Function) {
605                        return (Function) modelManager.getModel(functionName);
606                }
607
608                Function function = new Function(functionName);
609                function.setDetermined(false);
610                modelManager.bindModel(functionName, function);
611
612                return function;
613        }
614
615        public Function createFunction(TCaseExpression caseExpression) {
616                if (modelManager.getModel(caseExpression) instanceof Function) {
617                        return (Function) modelManager.getModel(caseExpression);
618                }
619
620                Function function = new Function(caseExpression);
621                modelManager.bindModel(caseExpression, function);
622
623                return function;
624        }
625
626        public QueryTable createQueryTable(TTable table) {
627                QueryTable tableModel = null;
628
629                if (table.getCTE() != null) {
630                        if (modelManager.getModel(table.getCTE()) instanceof QueryTable) {
631                                return (QueryTable) modelManager.getModel(table.getCTE());
632                        }
633
634                        tableModel = new QueryTable(table);
635
636                        modelManager.bindModel(table.getCTE(), tableModel);
637                } else if (table.getAliasClause() != null && table.getAliasClause().getColumns() != null) {
638                        if (modelManager.getModel(table.getAliasClause().getColumns()) instanceof QueryTable) {
639                                return (QueryTable) modelManager.getModel(table.getAliasClause().getColumns());
640                        }
641
642                        tableModel = new QueryTable(table);
643                        TObjectNameList columns = table.getAliasClause().getColumns();
644                        modelManager.bindModel(columns, tableModel);
645                        for (int i = 0; i < columns.size(); i++) {
646                                createResultColumn(tableModel, columns.getObjectName(i));
647                        }
648                        modelManager.bindModel(table, tableModel);
649                } else if (table.getSubquery() != null && !table.getSubquery().isCombinedQuery()) {
650                        if (modelManager.getModel(table.getSubquery().getResultColumnList()) instanceof QueryTable) {
651                                return (QueryTable) modelManager.getModel(table.getSubquery().getResultColumnList());
652                        }
653
654                        tableModel = new QueryTable(table);
655                        if (table.getSubquery().getResultColumnList() != null) {
656                                modelManager.bindModel(table.getSubquery().getResultColumnList(), tableModel);
657                        } else if (table.getSubquery().getTransformClause() != null) {
658                                modelManager.bindModel(table.getSubquery().getTransformClause(), tableModel);
659                        }
660                        modelManager.bindModel(table, tableModel);
661                } else if (table.getOutputMerge() != null) {
662                        if (modelManager
663                                        .getModel(table.getOutputMerge().getOutputClause().getSelectItemList()) instanceof QueryTable) {
664                                return (QueryTable) modelManager.getModel(table.getOutputMerge().getOutputClause().getSelectItemList());
665                        }
666
667                        tableModel = new QueryTable(table);
668                        modelManager.bindModel(table.getOutputMerge().getOutputClause().getSelectItemList(), tableModel);
669                        modelManager.bindModel(table, tableModel);
670                } else {
671                        if (modelManager.getModel(table) instanceof QueryTable) {
672                                return (QueryTable) modelManager.getModel(table);
673                        }
674                        
675                        if(ModelBindingManager.getGlobalStmtStack().peek() instanceof TMergeSqlStatement) {
676                                TMergeSqlStatement mergeStmt = (TMergeSqlStatement)ModelBindingManager.getGlobalStmtStack().peek();
677                                if (modelManager.getModel(mergeStmt) instanceof QueryTable) {
678                                        return (QueryTable) modelManager.getModel(mergeStmt);
679                                }
680                                tableModel = new QueryTable(mergeStmt);
681                                modelManager.bindModel(mergeStmt, tableModel);
682                        }
683                        else {
684                                tableModel = new QueryTable(table);
685                                modelManager.bindModel(table, tableModel);
686                        }
687                }
688                return tableModel;
689        }
690
691        public TableColumn createTableColumn(Table table, TObjectName column, boolean fromCreateTable) {
692                if (modelManager.getModel(new Pair<Table, TObjectName>(table, column)) instanceof TableColumn) {
693                        return (TableColumn) modelManager.getModel(new Pair<Table, TObjectName>(table, column));
694                }
695
696                if (table.isCreateTable() && !fromCreateTable) {
697                        String columnName = DlineageUtil.getColumnName(column);
698                        for (int i = 0; i < table.getColumns().size(); i++) {
699                                TableColumn columnModel = table.getColumns().get(i);
700                                if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals(columnName)) {
701                                        return columnModel;
702                                }
703                        }
704
705                        for (int i = 0; i < table.getColumns().size(); i++) {
706                                TableColumn columnModel = table.getColumns().get(i);
707                                if (columnModel.isVariant()) {
708                                        columnModel.bindStarLinkColumn(column);
709                                        return columnModel;
710                                }
711                                if (columnModel.hasStarLinkColumn()) {
712                                        columnModel.bindStarLinkColumn(column);
713                                        return columnModel;
714                                }
715                        }
716                        
717                        if(table.isDetermined()) {
718                                return null;
719                        }
720                } else {
721                        String columnName = DlineageUtil.getColumnName(column);
722                        for (int i = 0; i < table.getColumns().size(); i++) {
723                                TableColumn columnModel = table.getColumns().get(i);
724                                if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals(columnName)) {
725                                        return columnModel;
726                                }
727                        }
728                }
729
730                if ("*".equals(column.toString())) {
731                        if (!fromCreateTable && table.isCreateTable()) {
732                                return null;
733                        }
734                        for (int i = 0; i < table.getColumns().size(); i++) {
735                                TableColumn columnModel = table.getColumns().get(i);
736                                if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals("*")) {
737                                        return columnModel;
738                                }
739                        }
740                }
741
742                if (table.isCreateTable() && !fromCreateTable && "*".equals(column.getColumnNameOnly())) {
743                        return null;
744                }
745
746                if (table.isDetermined() && "*".equals(column.getColumnNameOnly())) {
747                        return null;
748                }
749
750                TableColumn columnModel = new TableColumn(table, column);
751                modelManager.bindModel(new Pair<Table, TObjectName>(table, column), columnModel);
752
753                if ("*".equals(column.getColumnNameOnly())) {
754                        TSQLEnv sqlenv = ModelBindingManager.getGlobalSQLEnv();
755                        if (sqlenv != null && sqlenv.searchTable(getQualifiedTableName(table)) != null) {
756                                table.setHasSQLEnv(true);
757                                TSQLTable sqlTable = sqlenv.searchTable(getQualifiedTableName(table));
758                                if (sqlTable.getColumnList() != null) {
759                                        boolean isDetermine = true;
760                                        for (TSQLColumn sqlColumn : sqlTable.getColumnList()) {
761                                                TObjectName objectName = new TObjectName();
762                                                if(sqlColumn.getName() == null){
763                                                        System.err.println("sqlevn table " + getQualifiedTableName(table) + " sqlColumn getName() returns null.");
764                                                        continue;
765                                                }
766                                                if(sqlColumn.getName().endsWith("*")) {
767                                                        isDetermine = false;
768                                                        continue;
769                                                }
770                                                objectName.setString(sqlColumn.getName());
771                                                columnModel.bindStarLinkColumn(objectName);
772                                        }
773                                        if (isDetermine) {
774                                                columnModel.setShowStar(false);
775                                                columnModel.setExpandStar(true);
776                                        }
777                                }
778                        } else if (column.getSourceTable() != null) {
779                                TObjectNameList columns = column.getSourceTable().getLinkedColumns();
780                                Map<String, TObjectName> columnMap = new LinkedHashMap<String, TObjectName>();
781                                for (int i = 0; i < columns.size(); i++) {
782                                        TObjectName item = columns.getObjectName(i);
783                                        String columnName = item.getColumnNameOnly();
784                                        if (Objects.equal(item.getSourceTable(), column.getSourceTable()) && !"*".equals(columnName)) {
785                                                columnMap.put(DlineageUtil.getIdentifierNormalColumnName(columnName), item);
786                                        }
787                                }
788                                for (int i = 0; i < columns.size(); i++) {
789                                        TObjectName item = columns.getObjectName(i);
790                                        String columnName = item.getColumnNameOnly();
791                                        if (!Objects.equal(item.getSourceTable(), column.getSourceTable()) && !"*".equals(columnName)) {
792                                                String key = DlineageUtil.getIdentifierNormalColumnName(columnName);
793                                                if (!columnMap.containsKey(key)) {
794                                                        columnMap.put(key, item);
795                                                }
796                                        }
797                                }
798                                columnModel.bindStarLinkColumns(new LinkedHashMap<String, Set<TObjectName>>());
799                        }
800                }
801
802                return columnModel;
803        }
804
805        public static String getQualifiedTableName(Table table) {
806                List<String> segments = SQLUtil.parseNames(table.name);
807                boolean supportCatalog = TSQLEnv.supportCatalog(ModelBindingManager.getGlobalVendor());
808                boolean supportSchema = TSQLEnv.supportSchema(ModelBindingManager.getGlobalVendor());
809                if (segments.size() < 2) {
810                        if (supportCatalog && supportSchema) {
811                                return getDefaultDatabase() + "." + getDefaultSchema() + "." + table.name;
812                        } else if (supportCatalog) {
813                                return TSQLEnv.DEFAULT_DB_NAME + "." + getDefaultDatabase() + "." + table.name;
814                        } else {
815                                return TSQLEnv.DEFAULT_DB_NAME + "." + getDefaultSchema() + "." + table.name;
816                        }
817                } else if (segments.size() < 3) {
818                        if (supportCatalog && supportSchema) {
819                                return getDefaultDatabase() + "." + table.name;
820                        } else {
821                                return TSQLEnv.DEFAULT_DB_NAME + "." + table.name;
822                        }
823                } else {
824                        return table.name;
825                }
826        }
827
828        protected static String getDefaultSchema() {
829                String defaultSchema = null;
830                if (ModelBindingManager.getGlobalSQLEnv() != null) {
831                        defaultSchema = ModelBindingManager.getGlobalSQLEnv().getDefaultSchemaName();
832                }
833                if (!SQLUtil.isEmpty(defaultSchema))
834                        return defaultSchema;
835                return TSQLEnv.DEFAULT_SCHEMA_NAME;
836        }
837
838        protected static String getDefaultDatabase() {
839                String defaultDatabase = null;
840                if (ModelBindingManager.getGlobalSQLEnv() != null) {
841                        defaultDatabase = ModelBindingManager.getGlobalSQLEnv().getDefaultCatalogName();
842                }
843                if (!SQLUtil.isEmpty(defaultDatabase))
844                        return defaultDatabase;
845                return TSQLEnv.DEFAULT_DB_NAME;
846        }
847
848        public TableColumn createStageLocation(Table table, TObjectName location) {
849                if (modelManager.getModel(new Pair<Table, TObjectName>(table, location)) instanceof TableColumn) {
850                        return (TableColumn) modelManager.getModel(new Pair<Table, TObjectName>(table, location));
851                }
852
853                StageLocation columnModel = new StageLocation(table, location);
854                modelManager.bindModel(new Pair<Table, TObjectName>(table, location), columnModel);
855                return columnModel;
856        }
857
858        public TableColumn createFileUri(Table table, TObjectName fileUri) {
859                if (modelManager.getModel(new Pair<Table, TObjectName>(table, fileUri)) instanceof TableColumn) {
860                        return (TableColumn) modelManager.getModel(new Pair<Table, TObjectName>(table, fileUri));
861                }
862
863                FileUri columnModel = new FileUri(table, fileUri);
864                modelManager.bindModel(new Pair<Table, TObjectName>(table, fileUri), columnModel);
865                return columnModel;
866        }
867
868        public TableColumn createVariableProperty(Table variableTable, TDeclareVariable variable) {
869                if (modelManager.getModel(new Pair<Table, TDeclareVariable>(variableTable, variable)) instanceof TableColumn) {
870                        return (TableColumn) modelManager.getModel(new Pair<Table, TDeclareVariable>(variableTable, variable));
871                }
872
873                TObjectName variableName = new TObjectName();
874                variableName.setString("property");
875                VariableProperty columnModel = new VariableProperty(variableTable, variableName, variable);
876                modelManager.bindModel(new Pair<Table, TDeclareVariable>(variableTable, variable), columnModel);
877                return columnModel;
878        }
879
880        public TableColumn createJsonTableColumn(Table table, TObjectName column) {
881                if (modelManager.getModel(new Pair<Table, TObjectName>(table, column)) instanceof TableColumn) {
882                        return (TableColumn) modelManager.getModel(new Pair<Table, TObjectName>(table, column));
883                }
884
885                JsonTableColumn columnModel = new JsonTableColumn(table, column);
886                modelManager.bindModel(new Pair<Table, TObjectName>(table, column), columnModel);
887                return columnModel;
888        }
889
890        public DataFlowRelationship createDataFlowRelation() {
891                DataFlowRelationship relation = new DataFlowRelationship();
892                modelManager.addRelation(relation);
893                return relation;
894        }
895
896        public CallRelationship createCallRelation() {
897                CallRelationship relation = new CallRelationship();
898                modelManager.addRelation(relation);
899                return relation;
900        }
901        
902        public CrudRelationship createCrudRelation() {
903                CrudRelationship relation = new CrudRelationship();
904                modelManager.addRelation(relation);
905                return relation;
906        }
907
908        public ERRelationship createERRelation() {
909                ERRelationship relation = new ERRelationship();
910                modelManager.addRelation(relation);
911                return relation;
912        }
913
914        public TableColumn createTableColumn(Table table, TResultColumn column) {
915                if (column.getAliasClause() != null && column.getAliasClause().getAliasName() != null) {
916                        TableColumn columnModel = new TableColumn(table, column.getAliasClause().getAliasName());
917                        modelManager.bindModel(column, columnModel);
918                        return columnModel;
919                } else if (column.getFieldAttr() != null) {
920                        TableColumn columnModel = new TableColumn(table, column.getFieldAttr());
921                        modelManager.bindModel(column, columnModel);
922                        return columnModel;
923                }
924                return null;
925        }
926
927        public TableColumn createTableColumn(Table table, TConstant constant) {
928                if (modelManager.getModel(new Pair<Table, TConstant>(table, constant)) instanceof TableColumn) {
929                        return (TableColumn) modelManager.getModel(new Pair<Table, TConstant>(table, constant));
930                }
931
932                TableColumn columnModel = new TableColumn(table, constant);
933                modelManager.bindModel(new Pair<Table, TConstant>(table, constant), columnModel);
934                return columnModel;
935        }
936
937        public TableColumn createTableColumn(Table table, TFunctionCall constantFunction) {
938                if (modelManager.getModel(new Pair<Table, TFunctionCall>(table, constantFunction)) instanceof TableColumn) {
939                        return (TableColumn) modelManager.getModel(new Pair<Table, TFunctionCall>(table, constantFunction));
940                }
941
942                TableColumn columnModel = new TableColumn(table, constantFunction);
943                modelManager.bindModel(new Pair<Table, TFunctionCall>(table, constantFunction), columnModel);
944                return columnModel;
945        }
946
947        public RecordSetRelationship createRecordSetRelation() {
948                RecordSetRelationship relation = new RecordSetRelationship();
949                modelManager.addRelation(relation);
950                return relation;
951        }
952
953        public ImpactRelationship createImpactRelation() {
954                ImpactRelationship relation = new ImpactRelationship();
955                modelManager.addRelation(relation);
956                return relation;
957        }
958
959        public IndirectImpactRelationship createIndirectImpactRelation() {
960                IndirectImpactRelationship relation = new IndirectImpactRelationship();
961                modelManager.addRelation(relation);
962                return relation;
963        }
964
965        public JoinRelationship createJoinRelation() {
966                JoinRelationship relation = new JoinRelationship();
967                modelManager.addRelation(relation);
968                return relation;
969        }
970
971        public Table createView(TCustomSqlStatement viewStmt, TObjectName viewName) {
972                return createView(viewStmt, viewName, false);
973        }
974
975        public Table createView(TCustomSqlStatement viewStmt, TObjectName viewName, boolean fromCreateView) {
976                if (modelManager.getViewModel(viewStmt) instanceof Table) {
977                        Table table = (Table) modelManager.getViewModel(viewStmt);
978                        table.setView(true);
979                        return table;
980                }
981
982                if (modelManager.getTableByName(DlineageUtil.getTableFullName(viewName.toString())) != null) {
983                        Table table = modelManager.getTableByName(DlineageUtil.getTableFullName(viewName.toString()));
984                        table.setView(true);
985                        return table;
986                }
987
988                Table viewModel = new Table(viewStmt, viewName);
989                viewModel.setCreateTable(fromCreateView);
990                viewModel.setView(true);
991                modelManager.bindViewModel(viewStmt, viewModel);
992                modelManager.bindTableByName(DlineageUtil.getTableFullName(viewName.toString()), viewModel);
993                return viewModel;
994        }
995
996        public Process createProcess(TCustomSqlStatement processStmt) {
997                if (modelManager.getProcessModel(processStmt) instanceof Process) {
998                        Process process = (Process) modelManager.getProcessModel(processStmt);
999                        return process;
1000                }
1001
1002                Process processModel = new Process(processStmt);
1003                modelManager.bindProcessModel(processStmt, processModel);
1004                return processModel;
1005        }
1006
1007        public Process createProcess(TFunctionCall functionCall) {
1008                if (modelManager.getProcessModel(functionCall) instanceof Process) {
1009                        Process process = (Process) modelManager.getProcessModel(functionCall);
1010                        return process;
1011                }
1012
1013                Process processModel = new Process(functionCall);
1014                modelManager.bindProcessModel(functionCall, processModel);
1015                return processModel;
1016        }
1017
1018        public TableColumn createViewColumn(Table viewModel, TObjectName column, int index, boolean fromCreateView) {
1019                Pair<Table, TObjectName> bindingModel = new Pair<Table, TObjectName>(viewModel, column);
1020                if (modelManager.getViewModel(bindingModel) instanceof TableColumn) {
1021                        return (TableColumn) modelManager.getViewModel(bindingModel);
1022                }
1023
1024                if (viewModel.isCreateTable() && !fromCreateView) {
1025                        if (index < viewModel.getColumns().size()) {
1026                                return (TableColumn) viewModel.getColumns().get(index);
1027                        } else {
1028                                return null;
1029                        }
1030                }
1031
1032                TableColumn columnModel = new TableColumn(viewModel, column, index);
1033                modelManager.bindViewModel(bindingModel, columnModel);
1034                return columnModel;
1035        }
1036
1037        public TableColumn createInsertTableColumn(Table tableModel, String columnName) {
1038                TObjectName columnNameObject = new TObjectName();
1039                columnNameObject.setString(columnName);
1040                Pair<Table, String> bindingModel = new Pair<Table, String>(tableModel, columnName);
1041
1042                if (tableModel.isCreateTable()) {
1043                        for (int i = 0; i < tableModel.getColumns().size(); i++) {
1044                                TableColumn columnModel = tableModel.getColumns().get(i);
1045                                if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals(columnName)) {
1046                                        modelManager.bindInsertModel(bindingModel, columnModel);
1047                                        return columnModel;
1048                                }
1049                        }
1050                }
1051
1052                if (modelManager.getInsertModel(bindingModel) instanceof TableColumn) {
1053                        return (TableColumn) modelManager.getInsertModel(bindingModel);
1054                }
1055                TableColumn columnModel = new TableColumn(tableModel, columnNameObject);
1056                modelManager.bindInsertModel(bindingModel, columnModel);
1057                return columnModel;
1058        }
1059
1060        public TableColumn createInsertTableColumn(Table tableModel, TObjectName column) {
1061                Pair<Table, TObjectName> bindingModel = new Pair<Table, TObjectName>(tableModel, column);
1062
1063                if (tableModel.isCreateTable()) {
1064                        String columnName = DlineageUtil.getColumnName(column);
1065                        for (int i = 0; i < tableModel.getColumns().size(); i++) {
1066                                TableColumn columnModel = tableModel.getColumns().get(i);
1067                                if (DlineageUtil.getIdentifierNormalColumnName(columnModel.getName()).equals(columnName)) {
1068                                        modelManager.bindInsertModel(bindingModel, columnModel);
1069                                        return columnModel;
1070                                }
1071                        }
1072                }
1073
1074                if (modelManager.getInsertModel(bindingModel) instanceof TableColumn) {
1075                        return (TableColumn) modelManager.getInsertModel(bindingModel);
1076                }
1077                TableColumn columnModel = new TableColumn(tableModel, column);
1078                modelManager.bindInsertModel(bindingModel, columnModel);
1079                return columnModel;
1080        }
1081
1082        public TableColumn createInsertTableColumn(Table tableModel, TExpression column, int columnIndex) {
1083                Pair<Table, TExpression> bindingModel = new Pair<Table, TExpression>(tableModel, column);
1084
1085                if (tableModel.isCreateTable()) {
1086                        if (columnIndex < tableModel.getColumns().size()) {
1087                                TableColumn columnModel = tableModel.getColumns().get(columnIndex);
1088                                modelManager.bindInsertModel(bindingModel, columnModel);
1089                                return columnModel;
1090                        } else {
1091                                return null;
1092                        }
1093                }
1094
1095                if (modelManager.getInsertModel(bindingModel) instanceof TableColumn) {
1096                        return (TableColumn) modelManager.getInsertModel(bindingModel);
1097                }
1098                TableColumn columnModel = new TableColumn(tableModel, column, columnIndex);
1099                modelManager.bindInsertModel(bindingModel, columnModel);
1100                return columnModel;
1101        }
1102
1103        public TableColumn createInsertTableColumn(Table tableModel, TConstant column, int columnIndex) {
1104                Pair<Table, TConstant> bindingModel = new Pair<Table, TConstant>(tableModel, column);
1105
1106                if (tableModel.isCreateTable()) {
1107                        if (columnIndex < tableModel.getColumns().size()) {
1108                                TableColumn columnModel = tableModel.getColumns().get(columnIndex);
1109                                modelManager.bindInsertModel(bindingModel, columnModel);
1110                                return columnModel;
1111                        } else {
1112                                return null;
1113                        }
1114                }
1115
1116                if (modelManager.getInsertModel(bindingModel) instanceof TableColumn) {
1117                        return (TableColumn) modelManager.getInsertModel(bindingModel);
1118                }
1119                TableColumn columnModel = new TableColumn(tableModel, column, columnIndex);
1120                modelManager.bindInsertModel(bindingModel, columnModel);
1121                return columnModel;
1122        }
1123
1124        public SelectSetResultSet createSelectSetResultSet(TSelectSqlStatement stmt) {
1125                if (modelManager.getModel(stmt) instanceof SelectSetResultSet) {
1126                        return (SelectSetResultSet) modelManager.getModel(stmt);
1127                }
1128                SelectSetResultSet resultSet = new SelectSetResultSet(stmt, stmt.getParentStmt() == null);
1129                modelManager.bindModel(stmt, resultSet);
1130                return resultSet;
1131        }
1132
1133        public ResultColumn createStarResultColumn(SelectResultSet resultSet,
1134                        Pair<TResultColumn, TObjectName> starColumnPair) {
1135                if (modelManager.getModel(starColumnPair) instanceof ResultColumn) {
1136                        return (ResultColumn) modelManager.getModel(starColumnPair);
1137                }
1138                ResultColumn column = new ResultColumn(resultSet, starColumnPair);
1139                modelManager.bindModel(starColumnPair, column);
1140                return column;
1141        }
1142
1143        public Variable createCursor(TCursorDeclStmt stmt) {
1144                String variableName = stmt.getCursorName().toString();
1145                String procedureName = DlineageUtil.getProcedureParentName(stmt);
1146                String variableString = variableName.toString();
1147                if (variableString.startsWith(":")) {
1148                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1149                }
1150                if (!SQLUtil.isEmpty(procedureName)) {
1151                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1152                }
1153                
1154                if (modelManager
1155                                .getTableByName(DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1156                        return (Variable) modelManager.getTableByName(DlineageUtil.getTableFullName(variableString));
1157                }
1158                Cursor tableModel = new Cursor(stmt);
1159                if (!SQLUtil.isEmpty(procedureName)) {
1160                        tableModel.setParent(procedureName);
1161                }
1162                modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString), tableModel);
1163                modelManager.bindModel(DlineageUtil.getTableFullName(variableString), tableModel);
1164                return tableModel;
1165        }
1166
1167        public Variable createCursor(TMssqlDeclare stmt) {
1168                String variableName = stmt.getCursorName().toString();
1169                String procedureName = DlineageUtil.getProcedureParentName(stmt);
1170                String variableString = variableName.toString();
1171                if (variableString.startsWith(":")) {
1172                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1173                }
1174                if (!SQLUtil.isEmpty(procedureName)) {
1175                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1176                }
1177                
1178                if (modelManager
1179                                .getTableByName(DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1180                        return (Variable) modelManager.getTableByName(DlineageUtil.getTableFullName(variableString));
1181                }
1182                Cursor tableModel = new Cursor(stmt);
1183                if (!SQLUtil.isEmpty(procedureName)) {
1184                        tableModel.setParent(procedureName);
1185                }
1186                modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString), tableModel);
1187                modelManager.bindModel(DlineageUtil.getTableFullName(variableString), tableModel);
1188                return tableModel;
1189        }
1190
1191        public Variable createCursor(TLoopStmt stmt) {
1192                String variableName = stmt.getRecordName().toString();
1193                String procedureName = DlineageUtil.getProcedureParentName(stmt);
1194                String variableString = variableName.toString();
1195                if (variableString.startsWith(":")) {
1196                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1197                }
1198                if (!SQLUtil.isEmpty(procedureName)) {
1199                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1200                }
1201                
1202                if (modelManager
1203                                .getTableByName(DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1204                        return (Variable) modelManager.getTableByName(DlineageUtil.getTableFullName(variableString));
1205                }
1206                Cursor tableModel = new Cursor(stmt);
1207                if (!SQLUtil.isEmpty(procedureName)) {
1208                        tableModel.setParent(procedureName);
1209                }
1210                modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString), tableModel);
1211                modelManager.bindModel(DlineageUtil.getTableFullName(variableString), tableModel);
1212                return tableModel;
1213        }
1214
1215        public Variable createCursor(TForStmt stmt) {
1216                String variableName = stmt.getLoopName().toString();
1217                String procedureName = DlineageUtil.getProcedureParentName(stmt);
1218                String variableString = variableName.toString();
1219                if (variableString.startsWith(":")) {
1220                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1221                }
1222                if (!SQLUtil.isEmpty(procedureName)) {
1223                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1224                }
1225                
1226                if (modelManager
1227                                .getTableByName(DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1228                        return (Variable) modelManager.getTableByName(DlineageUtil.getTableFullName(variableString));
1229                }
1230                Cursor tableModel = new Cursor(stmt);
1231                if (!SQLUtil.isEmpty(procedureName)) {
1232                        tableModel.setParent(procedureName);
1233                }
1234                modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString), tableModel);
1235                modelManager.bindModel(DlineageUtil.getTableFullName(variableString), tableModel);
1236                return tableModel;
1237        }
1238
1239        public Variable createCursor(TOpenforStmt stmt) {
1240                String variableName = stmt.getCursorVariableName().toString();
1241                String procedureName = DlineageUtil.getProcedureParentName(stmt);
1242                String variableString = variableName.toString();
1243                if (variableString.startsWith(":")) {
1244                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1245                }
1246                if (!SQLUtil.isEmpty(procedureName)) {
1247                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1248                }
1249                
1250                if (modelManager.getTableByName(
1251                                DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1252                        return (Variable) modelManager
1253                                        .getTableByName(DlineageUtil.getTableFullName(variableString));
1254                }
1255                Cursor tableModel = new Cursor(stmt);
1256                if (!SQLUtil.isEmpty(procedureName)) {
1257                        tableModel.setParent(procedureName);
1258                }
1259                modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString),
1260                                tableModel);
1261                modelManager.bindModel(DlineageUtil.getTableFullName(variableString), tableModel);
1262                return tableModel;
1263        }
1264
1265        public Variable createVariable(TObjectName variableName) {
1266                TCustomSqlStatement stmt = modelManager.getGlobalStmtStack().peek();
1267                String procedureName = DlineageUtil.getProcedureParentName(stmt);
1268                String variableString = variableName.toString();
1269                if (variableString.startsWith(":")) {
1270                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1271                }
1272                if (!SQLUtil.isEmpty(procedureName)) {
1273                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1274                }
1275                
1276                if (modelManager.getTableByName(DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1277                        return (Variable) modelManager.getTableByName(DlineageUtil.getTableFullName(variableString));
1278                }
1279                Variable variable = new Variable(variableName);
1280                if (!SQLUtil.isEmpty(procedureName)) {
1281                        variable.setParent(procedureName);
1282                }
1283                modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString), variable);
1284                modelManager.bindModel(DlineageUtil.getTableFullName(variableString), variable);
1285//              modelManager.bindTableByName(DlineageUtil.getTableFullName(variableName.toString()), variable);
1286//              modelManager.bindModel(DlineageUtil.getTableFullName(variableName.toString()), variable);
1287                return variable;
1288        }
1289
1290        public Variable createVariable(String variableName) {
1291                return createVariable(variableName, true);
1292        }
1293        
1294        public Variable createVariable(String variableName, boolean create) {
1295                TCustomSqlStatement stmt = modelManager.getGlobalStmtStack().peek();
1296                String procedureName = DlineageUtil.getProcedureParentName(stmt);
1297                String variableString = variableName.toString();
1298                if (variableString.startsWith(":")) {
1299                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1300                }
1301                if (!SQLUtil.isEmpty(procedureName)) {
1302                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1303                }
1304                
1305                if (modelManager.getTableByName(DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1306                        return (Variable) modelManager.getTableByName(DlineageUtil.getTableFullName(variableString));
1307                }
1308                
1309                if (create) {
1310                        Variable variable = new Variable(variableName);
1311                        if (!SQLUtil.isEmpty(procedureName)) {
1312                                variable.setParent(procedureName);
1313                        }
1314                        modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString), variable);
1315                        modelManager.bindModel(DlineageUtil.getTableFullName(variableString), variable);
1316//                      modelManager.bindTableByName(DlineageUtil.getTableFullName(variableName.toString()), variable);
1317//                      modelManager.bindModel(DlineageUtil.getTableFullName(variableName.toString()), variable);
1318                        return variable;
1319                }
1320                else {
1321                        return null;
1322                }
1323        }
1324
1325        public Variable createVariable(Procedure procedure, String variableName, boolean create) {
1326                String procedureName = procedure.getName();
1327                String variableString = variableName.toString();
1328                if (variableString.startsWith(":")) {
1329                        variableString = variableString.substring(variableString.indexOf(":") + 1);
1330                }
1331                if (!SQLUtil.isEmpty(procedureName)) {
1332                        variableString = DlineageUtil.getTableFullName(procedureName) + "." + SQLUtil.getIdentifierNormalTableName(variableString);
1333                }
1334
1335                if (modelManager.getTableByName(DlineageUtil.getTableFullName(variableString)) instanceof Variable) {
1336                        return (Variable) modelManager.getTableByName(DlineageUtil.getTableFullName(variableString));
1337                }
1338
1339                if (create) {
1340                        Variable variable = new Variable(variableName);
1341                        if (!SQLUtil.isEmpty(procedureName)) {
1342                                variable.setParent(procedureName);
1343                        }
1344                        modelManager.bindTableByName(DlineageUtil.getTableFullName(variableString), variable);
1345                        modelManager.bindModel(DlineageUtil.getTableFullName(variableString), variable);
1346//                      modelManager.bindTableByName(DlineageUtil.getTableFullName(variableName.toString()), variable);
1347//                      modelManager.bindModel(DlineageUtil.getTableFullName(variableName.toString()), variable);
1348                        return variable;
1349                }
1350                else {
1351                        return null;
1352                }
1353        }
1354
1355        public Database createDatabase(TObjectName databaseName) {
1356                if (modelManager.getTableByName(DlineageUtil.getTableFullName(databaseName.toString())) instanceof Database) {
1357                        return (Database) modelManager.getTableByName(DlineageUtil.getTableFullName(databaseName.toString()));
1358                }
1359                Database database = new Database(databaseName);
1360                modelManager.bindTableByName(DlineageUtil.getTableFullName(databaseName.toString()), database);
1361                modelManager.bindModel(DlineageUtil.getTableFullName(databaseName.toString()), database);
1362                return database;
1363        }
1364
1365        public Schema createSchema(TObjectName schemaName) {
1366                if (modelManager
1367                                .getTableByName(DlineageUtil.getIdentifierNormalTableName(schemaName.toString())) instanceof Schema) {
1368                        return (Schema) modelManager
1369                                        .getTableByName(DlineageUtil.getIdentifierNormalTableName(schemaName.toString()));
1370                }
1371                Schema schema = new Schema(schemaName);
1372                modelManager.bindTableByName(DlineageUtil.getIdentifierNormalTableName(schemaName.toString()), schema);
1373                modelManager.bindModel(DlineageUtil.getIdentifierNormalTableName(schemaName.toString()), schema);
1374                return schema;
1375        }
1376
1377        public PivotedTable createPivotdTable(TPivotClause pivotedTable) {
1378                if (modelManager.getModel(pivotedTable) instanceof PivotedTable) {
1379                        return (PivotedTable) modelManager.getModel(pivotedTable);
1380                }
1381                PivotedTable resultSet = new PivotedTable(pivotedTable);
1382                modelManager.bindModel(pivotedTable, resultSet);
1383                if (pivotedTable.getPivotTable() != null) {
1384                        modelManager.bindModel(pivotedTable.getPivotTable(), resultSet);
1385                }
1386                return resultSet;
1387        }
1388
1389        public Procedure createProcedure(TStoredProcedureSqlStatement stmt) {
1390                if (stmt == null || stmt.getStoredProcedureName() == null) {
1391                        return null;
1392                }
1393                String procedureNameWithArgs = DlineageUtil
1394                                .getIdentifierNormalTableName(DlineageUtil.getProcedureNameWithArgs(stmt));
1395                String procedureNameWithArgNum = DlineageUtil
1396                                .getIdentifierNormalTableName(DlineageUtil.getProcedureNameWithArgNum(stmt));
1397                String procedureNameWithInputArgNum = DlineageUtil
1398                                .getIdentifierNormalTableName(DlineageUtil.getProcedureNameWithInputArgNum(stmt));
1399                if (ModelBindingManager.getGlobalOraclePackage() != null) {
1400                        procedureNameWithArgs = ModelBindingManager.getGlobalOraclePackage().getName() + "."
1401                                        + procedureNameWithArgs;
1402                        procedureNameWithArgNum = ModelBindingManager.getGlobalOraclePackage().getName() + "."
1403                                        + procedureNameWithArgNum;
1404                        procedureNameWithInputArgNum = ModelBindingManager.getGlobalOraclePackage().getName() + "."
1405                                        + procedureNameWithInputArgNum;
1406                }
1407                if (this.modelManager.getModel(stmt) instanceof Procedure) {
1408                        return (Procedure) this.modelManager.getModel(stmt);
1409                } else if (this.modelManager.getProcedureByName(procedureNameWithArgs) != null) {
1410                        return (Procedure) this.modelManager.getProcedureByName(procedureNameWithArgs);
1411                } else if (this.modelManager.getProcedureByName(procedureNameWithArgNum) != null) {
1412                        return (Procedure) this.modelManager.getProcedureByName(procedureNameWithArgNum);
1413                } else if (this.modelManager.getProcedureByName(procedureNameWithInputArgNum) != null) {
1414                        return (Procedure) this.modelManager.getProcedureByName(procedureNameWithInputArgNum);
1415                } else {
1416                        Procedure procedure = new Procedure(stmt);
1417                        this.modelManager.bindModel(stmt, procedure);
1418                        this.modelManager.bindProcedureByName(procedureNameWithArgs, procedure);
1419                        this.modelManager.bindProcedureByName(procedureNameWithArgNum, procedure);
1420                        this.modelManager.bindProcedureByName(procedureNameWithInputArgNum, procedure);
1421                        return procedure;
1422                }
1423        }
1424
1425        public OraclePackage createOraclePackage(TPlsqlCreatePackage stmt) {
1426                if (this.modelManager.getModel(stmt) instanceof OraclePackage) {
1427                        return (OraclePackage) this.modelManager.getModel(stmt);
1428                } else {
1429                        OraclePackage oraclePackage = new OraclePackage(stmt);
1430                        this.modelManager.bindModel(stmt, oraclePackage);
1431                        this.modelManager.bindOraclePackageByName(
1432                                        DlineageUtil.getIdentifierNormalTableName(DlineageUtil.getProcedureNameWithArgs(stmt)),
1433                                        oraclePackage);
1434                        this.modelManager.bindOraclePackageByName(
1435                                        DlineageUtil.getIdentifierNormalTableName(DlineageUtil.getProcedureNameWithArgNum(stmt)),
1436                                        oraclePackage);
1437                        this.modelManager.bindOraclePackageByName(
1438                                        DlineageUtil.getIdentifierNormalTableName(DlineageUtil.getProcedureNameWithInputArgNum(stmt)),
1439                                        oraclePackage);
1440                        return oraclePackage;
1441                }
1442        }
1443
1444        public Procedure createProcedureFromFunctionCall(TFunctionCall function) {
1445                if (this.modelManager.getModel(function) instanceof Procedure) {
1446                        return (Procedure) this.modelManager.getModel(function);
1447                } else {
1448                        Procedure procedure = new Procedure(function);
1449                        procedure.setType(ESqlStatementType.sstcreateprocedure);
1450                        this.modelManager.bindModel(function, procedure);
1451                        this.modelManager.bindProcedureByName(DlineageUtil.getIdentifierNormalTableName(procedure.getName()),
1452                                        procedure);
1453                        return procedure;
1454                }
1455        }
1456        
1457//      public Procedure createProcedureByName(TObjectName procedureName) {
1458//              if (this.modelManager.getModel(procedureName) instanceof Procedure) {
1459//                      return (Procedure) this.modelManager.getModel(procedureName);
1460//              }
1461//              else if (this.modelManager
1462//                              .getProcedureByName(DlineageUtil.getIdentifierNormalTableName(procedureName.toString())) != null) {
1463//                      return modelManager.getProcedureByName(DlineageUtil.getIdentifierNormalTableName(procedureName.toString()));
1464//              }
1465//              else {
1466//                      Procedure procedure = new Procedure(procedureName);
1467//                      procedure.setType(ESqlStatementType.sstcreateprocedure);
1468//                      this.modelManager.bindModel(procedureName, procedure);
1469//                      this.modelManager.bindProcedureByName(DlineageUtil.getIdentifierNormalTableName(procedure.getName()),
1470//                                      procedure);
1471//                      return procedure;
1472//              }
1473//      }
1474
1475        public Procedure createProcedureByName(TObjectName procedureName, int argumentSize) {
1476                String procedureNameWithArgSize = procedureName.toString() + "(" + argumentSize + ")";
1477                if (argumentSize <= 0 || !DlineageUtil.supportFunctionOverride(ModelBindingManager.getGlobalVendor())) {
1478                        procedureNameWithArgSize = procedureName.toString();
1479                }
1480                if (this.modelManager.getModel(procedureName) instanceof Procedure) {
1481                        return (Procedure) this.modelManager.getModel(procedureName);
1482                }
1483                else if (this.modelManager
1484                                .getProcedureByName(DlineageUtil.getIdentifierNormalTableName(procedureNameWithArgSize)) != null) {
1485                        return modelManager.getProcedureByName(DlineageUtil.getIdentifierNormalTableName(procedureNameWithArgSize));
1486                }
1487                else {
1488                        Procedure procedure = new Procedure(procedureName);
1489                        procedure.setType(ESqlStatementType.sstcreateprocedure);
1490                        this.modelManager.bindModel(procedureName, procedure);
1491                        this.modelManager.bindProcedureByName(DlineageUtil.getIdentifierNormalTableName(procedureNameWithArgSize),
1492                                        procedure);
1493                        return procedure;
1494                }
1495        }
1496
1497        public Argument createProcedureArgument(Procedure procedure, TParameterDeclaration parameter, int index) {
1498                if (this.modelManager.getModel(parameter) instanceof Argument) {
1499                        return (Argument) this.modelManager.getModel(parameter);
1500                } else {
1501                        if (procedure.getArguments() != null) {
1502                                for (Argument argument : procedure.getArguments()) {
1503                                        if (parameter.getParameterName() == null) {
1504                                                continue;
1505                                        }
1506                                        if (argument.getName().equals(parameter.getParameterName().toString())) {
1507                                                return argument;
1508                                        }
1509                                }
1510                        }
1511                        Argument argumentModel = new Argument(procedure, parameter, index);
1512                        this.modelManager.bindModel(parameter, argumentModel);
1513                        this.modelManager.bindModel(procedure.getName() + ":" + argumentModel.getName(), argumentModel);
1514                        return argumentModel;
1515                }
1516        }
1517
1518        public Argument createProcedureArgument(OraclePackage oraclePackage, TParameterDeclaration parameter, int index) {
1519                if (this.modelManager.getModel(parameter) instanceof Argument) {
1520                        return (Argument) this.modelManager.getModel(parameter);
1521                } else {
1522                        Argument argumentModel = new Argument(oraclePackage, parameter, index);
1523                        this.modelManager.bindModel(parameter, argumentModel);
1524                        return argumentModel;
1525                }
1526        }
1527
1528}