您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

DataSourcesDataAccess.java 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package com.rthoni.intellij.codefromds.DataAccess;
  2. import com.intellij.database.psi.*;
  3. import com.intellij.database.util.DasUtil;
  4. import com.rthoni.intellij.codefromds.business.Helper;
  5. import com.rthoni.intellij.codefromds.dbo.template.*;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. /**
  9. * Created by robin on 4/13/17.
  10. */
  11. public class DataSourcesDataAccess {
  12. public static List<DataSourceDbo> getDataSourcesDbo()
  13. {
  14. return Helper.getDataSources().stream()
  15. .map(DataSourcesDataAccess::dataSourceToDbo)
  16. .collect(Collectors.toList());
  17. }
  18. public static DataSourceDbo getDataSourceDbo(String name)
  19. {
  20. return Helper.getDataSources().stream()
  21. .filter(dataSource -> dataSource.getName().equals(name))
  22. .map(DataSourcesDataAccess::dataSourceToDbo)
  23. .findFirst().orElse(null);
  24. }
  25. private static DataSourceDbo dataSourceToDbo(DbDataSource dataSource)
  26. {
  27. DataSourceDbo dataSourceDbo = new DataSourceDbo();
  28. dataSourceDbo.setName(dataSource.getName());
  29. final DataHolder<TableDataSourceDbo> tableDataSourceDbo = new DataHolder<>();
  30. final DataHolder<ColumnDataSourceDbo> columnDataSourceDbo = new DataHolder<>();
  31. dataSource.getModel().traverser().forEach(dasObject ->
  32. {
  33. if (dasObject instanceof DbTable) {
  34. DbTable table = (DbTable) dasObject;
  35. tableDataSourceDbo.data = new TableDataSourceDbo();
  36. tableDataSourceDbo.data.setName(table.getName());
  37. dataSourceDbo.addTable(tableDataSourceDbo.data);
  38. }
  39. else if (dasObject instanceof DbColumn) {
  40. DbColumn column = (DbColumn) dasObject;
  41. columnDataSourceDbo.data = new ColumnDataSourceDbo();
  42. columnDataSourceDbo.data.setName(column.getName());
  43. columnDataSourceDbo.data.setNotNull(column.isNotNull());
  44. SqlTypeDbo type = new SqlTypeDbo();
  45. type.setType(column.getDataType().typeName);
  46. type.setVagueArg(column.getDataType().vagueArg);
  47. columnDataSourceDbo.data.setSqlType(type);
  48. columnDataSourceDbo.data.setDefaultValue(column.getDefault());
  49. columnDataSourceDbo.data.setPrimary(DasUtil.isPrimary(column));
  50. tableDataSourceDbo.data.addColumn(columnDataSourceDbo.data);
  51. }
  52. });
  53. dataSource.getModel().traverser().forEach(dasObject ->
  54. {
  55. if (dasObject instanceof DbTable) {
  56. DbTable table = (DbTable) dasObject;
  57. tableDataSourceDbo.data = dataSourceDbo.findTable(table.getName());
  58. // System.out.println("Table: " + tableDataSourceDbo.data.getName());
  59. DasUtil.getForeignKeys(table).forEach(fk ->
  60. {
  61. if (fk.getRefTable() == null) {
  62. return;
  63. }
  64. TableDataSourceDbo srcTable = dataSourceDbo.findTable(fk.getTable().getName());
  65. TableDataSourceDbo targetTable = dataSourceDbo.findTable(fk.getRefTable().getName());
  66. ForeignKeyDbo fkDbo = new ForeignKeyDbo();
  67. fkDbo.setName(fk.getName());
  68. fkDbo.setSourceTable(srcTable);
  69. fkDbo.setSourceForeignKeyName("fk_" + targetTable.getName());//TODO find if it already exists
  70. fkDbo.setTargetTable(targetTable);
  71. fkDbo.setTargetForeignKeyName(srcTable.getName() + "_fk");//TODO find if it already exists
  72. fk.getColumnsRef().names().forEach(s -> fkDbo.addSourceColumn(srcTable.findColumn(s)));
  73. fk.getRefColumns().names().forEach(s -> fkDbo.addTargetColumn(targetTable.findColumn(s)));
  74. srcTable.addSourceForeignKey(fkDbo);
  75. targetTable.addTargetForeignKey(fkDbo);
  76. // System.out.println("FK: " + fkDbo.getName());
  77. });
  78. }
  79. else if (dasObject instanceof DbColumn) {
  80. DbColumn column = (DbColumn) dasObject;
  81. columnDataSourceDbo.data = tableDataSourceDbo.data.findColumn(column.getName());
  82. // System.out.println("Column: " + columnDataSourceDbo.data.getName());
  83. }
  84. else if (dasObject instanceof DbIndex) {
  85. DbIndex index = (DbIndex) dasObject;
  86. // System.out.println("Index: " + index.getName());
  87. }
  88. else if (dasObject instanceof DbConstraint) {
  89. DbConstraint constraint = (DbConstraint) dasObject;
  90. // System.out.println("Constraint: " + constraint.getName());
  91. }
  92. else if (dasObject instanceof DbRoutine) {
  93. DbRoutine sp = (DbRoutine) dasObject;
  94. StoredProcedureDbo spDbo = new StoredProcedureDbo();
  95. spDbo.setSelected(true);
  96. dataSourceDbo.addStoredProcedure(spDbo);
  97. spDbo.setName(sp.getName());
  98. // System.out.println("SP: " + spDbo.getName());
  99. DataHolder<Integer> position = new DataHolder<>();
  100. position.data = 0;
  101. sp.getArguments().forEach(o ->
  102. {
  103. SqlTypeDbo sqlTypeDbo = new SqlTypeDbo();
  104. sqlTypeDbo.setType(o.getDataType().typeName);
  105. sqlTypeDbo.setVagueArg(o.getDataType().vagueArg);
  106. if (o.getArgumentDirection().isReturnOrResult()) {
  107. spDbo.setSqlType(sqlTypeDbo);
  108. // System.out.println("SP return: " + sqlTypeDbo.getType());
  109. }
  110. else {
  111. StoredProcedureArgDbo argDbo = new StoredProcedureArgDbo();
  112. argDbo.setName(o.getName().isEmpty() ? "arg" + position.data : o.getName());
  113. argDbo.setSqlType(sqlTypeDbo);
  114. argDbo.setOut(o.getArgumentDirection().isOut());
  115. spDbo.addArgument(argDbo);
  116. ++position.data;
  117. // System.out.println("SP arg: " + o.getName());
  118. }
  119. });
  120. }
  121. // else {
  122. // System.out.println(dasObject.getClass().getName());
  123. // }
  124. });
  125. return dataSourceDbo;
  126. }
  127. }