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