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