提交 d1354f40 编写于 作者: S serge-rider

MySQL execution plan (JSON format model)

上级 25756c94
......@@ -125,6 +125,33 @@ public class CommonUtils {
return Character.toUpperCase(str.charAt(0)) + str.substring(1);
}
public static String toCamelCase(String str) {
if (isEmpty(str)) {
return null;
}
final StringBuilder ret = new StringBuilder(str.length());
boolean isWordStart = true;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isLetterOrDigit(ch)) {
if (isWordStart) {
ret.append(Character.toUpperCase(ch));
isWordStart = false;
} else {
ret.append(Character.toLowerCase(ch));
}
} else {
ret.append(ch);
isWordStart = true;
}
}
return ret.toString();
}
@NotNull
public static <T> T notNull(@Nullable T value, @NotNull T defaultValue) {
return value != null ? value : defaultValue;
......
......@@ -177,28 +177,28 @@ meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.definer.name=Def
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.algorithm.name=Algorithm
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.name.name=View Name
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.objectDefinitionText.name=Definition
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.name=ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.description=The SELECT identifier. This is the sequential number of the SELECT within the query
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.name=Select Type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.description=The type of SELECT
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.name=Table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.description=The table to which the row of output refers
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.name=Type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.description=The join type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.name=Possible Keys
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.description=Indicates which indexes MySQL can choose from use to find the rows in this table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.name=Key
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.description=Key (index) that MySQL actually decided to use
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.name=Key Length
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.description=Length of the key that MySQL decided to use
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.name=Ref
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.description=Shows which columns or constants are compared to the index named in the key column to select rows from the table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.name=Rows
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.description=Number of rows MySQL believes it must examine to execute the query
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.name=Filtered
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.description=Estimated percentage of table rows that will be filtered by the table condition
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.name=Extra
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.description=Additional information about how MySQL resolves the query
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.name=ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.description=The SELECT identifier. This is the sequential number of the SELECT within the query
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.name=Select Type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.description=The type of SELECT
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.name=Table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.description=The table to which the row of output refers
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.name=Type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.description=The join type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.name=Possible Keys
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.description=Indicates which indexes MySQL can choose from use to find the rows in this table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.name=Key
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.description=Key (index) that MySQL actually decided to use
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.name=Key Length
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.description=Length of the key that MySQL decided to use
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.name=Ref
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.description=Shows which columns or constants are compared to the index named in the key column to select rows from the table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.name=Rows
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.description=Number of rows MySQL believes it must examine to execute the query
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.name=Filtered
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.description=Estimated percentage of table rows that will be filtered by the table condition
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.name=Extra
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.description=Additional information about how MySQL resolves the query
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.pid.name=PID
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.pid.description=Process ID
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.user.name=User
......
......@@ -162,28 +162,28 @@ meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.updatable.name=U
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.definer.name=Definer
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.name.name=Nom de la vue
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.objectDefinitionText.name=D\u00E9finition
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.name=ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.description=Identificateur SELECT. Ceci est le num\u00E9ro s\u00E9quentiel du SELECT dans la requ\u00EAte
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.name=Type de s\u00E9lection
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.description=Type du SELECT
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.name=Table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.description=La table \u00E0 laquelle fait r\u00E9f\u00E9rence la ligne en sortie
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.name=Type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.description=Type de jointure
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.name=Clefs possibles
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.description=Indique quels indexes MySQL peut choisir pour retrouver les lignes dans cette table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.name=Clef
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.description=Clef (index) que MySQL a d\u00E9cid\u00E9 d'utiliser
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.name=Longueur de la clef
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.description=Longueur de la clef que MySQL a d\u00E9cid\u00E9 d'utiliser
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.name=Ref
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.description=Montre quelles colonnes ou contraintes sont compar\u00E9es \u00E0 l'index nomm\u00E9 dans la colonne de clef pour s\u00E9lectionner des lignes dans la table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.name=Lignes
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.description=Nombre de lignes que MySQL pense devoir examiner pour ex\u00E9cuter la requ\u00EAte
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.name=Filtr\u00E9
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.description=Pourcentage estim\u00E9 de lignes que seront filtr\u00E9es par la condition
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.name=Extra
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.description=Informations compl\u00E9mentaires sur la mani\u00E8re de r\u00E9soudre la requ\u00EAte ar MySQL
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.name=ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.description=Identificateur SELECT. Ceci est le num\u00E9ro s\u00E9quentiel du SELECT dans la requ\u00EAte
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.name=Type de s\u00E9lection
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.description=Type du SELECT
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.name=Table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.description=La table \u00E0 laquelle fait r\u00E9f\u00E9rence la ligne en sortie
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.name=Type
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.description=Type de jointure
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.name=Clefs possibles
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.description=Indique quels indexes MySQL peut choisir pour retrouver les lignes dans cette table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.name=Clef
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.description=Clef (index) que MySQL a d\u00E9cid\u00E9 d'utiliser
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.name=Longueur de la clef
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.description=Longueur de la clef que MySQL a d\u00E9cid\u00E9 d'utiliser
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.name=Ref
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.description=Montre quelles colonnes ou contraintes sont compar\u00E9es \u00E0 l'index nomm\u00E9 dans la colonne de clef pour s\u00E9lectionner des lignes dans la table
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.name=Lignes
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.description=Nombre de lignes que MySQL pense devoir examiner pour ex\u00E9cuter la requ\u00EAte
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.name=Filtr\u00E9
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.description=Pourcentage estim\u00E9 de lignes que seront filtr\u00E9es par la condition
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.name=Extra
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.description=Informations compl\u00E9mentaires sur la mani\u00E8re de r\u00E9soudre la requ\u00EAte ar MySQL
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.pid.name=PID
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.pid.description=ID du processus
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.user.name=Utilisateur
......
......@@ -162,28 +162,28 @@ meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.updatable.name=\
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.definer.name=\u5B9A\u7FA9\u8005
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.name.name=\u30D3\u30E5\u30FC\u540D
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.objectDefinitionText.name=\u5B9A\u7FA9
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.name=ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.description=SELECT\u8B58\u5225\u5B50\u3002\u3053\u308C\u306F\u3001\u30AF\u30A8\u30EA\u5185\u306ESELECT\u306E\u9023\u7D9A\u756A\u53F7\u3067\u3059
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.name=\u30BF\u30A4\u30D7\u306E\u9078\u629E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.description=SELECT\u306E\u30BF\u30A4\u30D7
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.name=\u8868
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.description=\u51FA\u529B\u884C\u304C\u53C2\u7167\u3059\u308B\u30C6\u30FC\u30D6\u30EB
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.name=\u30BF\u30A4\u30D7
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.description=\u7D50\u5408\u30BF\u30A4\u30D7
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.name=\u53EF\u80FD\u306A\u30AD\u30FC
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.description=MySQL\u304C\u3053\u306E\u30C6\u30FC\u30D6\u30EB\u306E\u884C\u306E\u691C\u7D22\u306B\u4F7F\u7528\u3067\u304D\u308B\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u793A\u3057\u307E\u3059
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.name=\u30AD\u30FC
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.description=MySQL\u304C\u5B9F\u969B\u306B\u4F7F\u7528\u3059\u308B\u3053\u3068\u3092\u6C7A\u3081\u305F\u30AD\u30FC\uFF08\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\uFF09
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.name=\u30AD\u30FC\u306E\u9577\u3055
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.description=MySQL\u304C\u4F7F\u7528\u3059\u308B\u3053\u3068\u3092\u6C7A\u3081\u305F\u9375\u306E\u9577\u3055
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.name=Ref
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.description=\u30AD\u30FC\u5217\u3067\u6307\u5B9A\u3055\u308C\u305F\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3068\u6BD4\u8F03\u3055\u308C\u308B\u5217\u307E\u305F\u306F\u5B9A\u6570\u3092\u8868\u793A\u3057\u3066\u3001\u30C6\u30FC\u30D6\u30EB\u304B\u3089\u884C\u3092\u9078\u629E\u3057\u307E\u3059\u3002
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.name=\u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.description=\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3059\u308B\u305F\u3081\u306BMySQL\u304C\u691C\u8A0E\u3057\u306A\u3051\u308C\u3070\u306A\u3089\u306A\u3044\u884C\u306E\u6570
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.name=\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3055\u308C\u305F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.description=\u30C6\u30FC\u30D6\u30EB\u6761\u4EF6\u306B\u3088\u3063\u3066\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3055\u308C\u308B\u30C6\u30FC\u30D6\u30EB\u884C\u306E\u63A8\u5B9A\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.name=\u4F59\u5206\u306A
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.description=MySQL\u304C\u30AF\u30A8\u30EA\u3092\u89E3\u6C7A\u3059\u308B\u65B9\u6CD5\u306B\u95A2\u3059\u308B\u8FFD\u52A0\u60C5\u5831
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.name=ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.description=SELECT\u8B58\u5225\u5B50\u3002\u3053\u308C\u306F\u3001\u30AF\u30A8\u30EA\u5185\u306ESELECT\u306E\u9023\u7D9A\u756A\u53F7\u3067\u3059
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.name=\u30BF\u30A4\u30D7\u306E\u9078\u629E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.description=SELECT\u306E\u30BF\u30A4\u30D7
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.name=\u8868
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.description=\u51FA\u529B\u884C\u304C\u53C2\u7167\u3059\u308B\u30C6\u30FC\u30D6\u30EB
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.name=\u30BF\u30A4\u30D7
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.description=\u7D50\u5408\u30BF\u30A4\u30D7
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.name=\u53EF\u80FD\u306A\u30AD\u30FC
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.description=MySQL\u304C\u3053\u306E\u30C6\u30FC\u30D6\u30EB\u306E\u884C\u306E\u691C\u7D22\u306B\u4F7F\u7528\u3067\u304D\u308B\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u793A\u3057\u307E\u3059
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.name=\u30AD\u30FC
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.description=MySQL\u304C\u5B9F\u969B\u306B\u4F7F\u7528\u3059\u308B\u3053\u3068\u3092\u6C7A\u3081\u305F\u30AD\u30FC\uFF08\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\uFF09
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.name=\u30AD\u30FC\u306E\u9577\u3055
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.description=MySQL\u304C\u4F7F\u7528\u3059\u308B\u3053\u3068\u3092\u6C7A\u3081\u305F\u9375\u306E\u9577\u3055
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.name=Ref
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.description=\u30AD\u30FC\u5217\u3067\u6307\u5B9A\u3055\u308C\u305F\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3068\u6BD4\u8F03\u3055\u308C\u308B\u5217\u307E\u305F\u306F\u5B9A\u6570\u3092\u8868\u793A\u3057\u3066\u3001\u30C6\u30FC\u30D6\u30EB\u304B\u3089\u884C\u3092\u9078\u629E\u3057\u307E\u3059\u3002
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.name=\u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.description=\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3059\u308B\u305F\u3081\u306BMySQL\u304C\u691C\u8A0E\u3057\u306A\u3051\u308C\u3070\u306A\u3089\u306A\u3044\u884C\u306E\u6570
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.name=\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3055\u308C\u305F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.description=\u30C6\u30FC\u30D6\u30EB\u6761\u4EF6\u306B\u3088\u3063\u3066\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3055\u308C\u308B\u30C6\u30FC\u30D6\u30EB\u884C\u306E\u63A8\u5B9A\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.name=\u4F59\u5206\u306A
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.description=MySQL\u304C\u30AF\u30A8\u30EA\u3092\u89E3\u6C7A\u3059\u308B\u65B9\u6CD5\u306B\u95A2\u3059\u308B\u8FFD\u52A0\u60C5\u5831
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.pid.name=PID
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.pid.description=\u30D7\u30ED\u30BB\u30B9ID
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.user.name=\u30E6\u30FC\u30B6\u30FC
......
......@@ -165,23 +165,23 @@ meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.definer.name=\u0
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.algorithm.name=\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.name.name=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.definition.name=\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.description=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 SELECT'\u0430. \u042D\u0442\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043D\u043E\u043C\u0435\u0440 SELECT'\u0430 \u0432 \u0437\u0430\u043F\u0440\u043E\u0441\u0435.
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.name=\u0422\u0438\u043F \u0441\u0435\u043B\u0435\u043A\u0442\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.description=\u0422\u0438\u043F \u0441\u0435\u043B\u0435\u043A\u0442\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.name=\u0422\u0430\u0431\u043B\u0438\u0446\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.name=\u0422\u0438\u043F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.description=\u0422\u0438\u043F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.name=\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u0435 \u043A\u043B\u044E\u0447\u0438
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.description=\u041E\u0431\u043E\u0437\u043D\u0430\u0447\u0430\u0435\u0442, \u043A\u0430\u043A\u0438\u0435 \u0438\u043D\u0434\u0435\u043A\u0441\u044B \u043C\u043E\u0436\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C MySQL \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0432 \u044D\u0442\u043E\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u0435
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.name=\u041A\u043B\u044E\u0447
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.description=\u041A\u043B\u044E\u0447 (\u0438\u043D\u0434\u0435\u043A\u0441), \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 MySQL
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.name=\u0414\u043B\u0438\u043D\u0430 \u043A\u043B\u044E\u0447\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.description=\u0414\u043B\u0438\u043D\u0430 \u043A\u043B\u044E\u0447\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 MySQL
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.description=\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u043A\u0430\u043A\u0438\u0435 \u043A\u043E\u043B\u043E\u043D\u043A\u0438 \u0438\u043B\u0438 \u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B \u0441\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0441 \u0438\u043C\u0435\u043D\u0430\u043C\u0438 \u0432 \u0438\u043D\u0434\u0435\u043A\u0441\u0435 \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0439 \u043A\u043E\u043B\u043E\u043D\u043A\u0438 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u043A\u0435 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.name=\u0417\u0430\u043F\u0438\u0441\u0438
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.name=\u041E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u043E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.description=\u041E\u0446\u0435\u043D\u043E\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0446\u0435\u043D\u0442 \u0447\u0438\u0441\u043B\u0430 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u044B \u0443\u0441\u043B\u043E\u0432\u0438\u0435\u043C \u0442\u0430\u0431\u043B\u0438\u0446\u044B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.description=\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0442\u043E\u043C, \u043A\u0430\u043A MySQL \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043F\u0440\u043E\u0441
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.description=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 SELECT'\u0430. \u042D\u0442\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043D\u043E\u043C\u0435\u0440 SELECT'\u0430 \u0432 \u0437\u0430\u043F\u0440\u043E\u0441\u0435.
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.name=\u0422\u0438\u043F \u0441\u0435\u043B\u0435\u043A\u0442\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.description=\u0422\u0438\u043F \u0441\u0435\u043B\u0435\u043A\u0442\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.name=\u0422\u0430\u0431\u043B\u0438\u0446\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.name=\u0422\u0438\u043F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.description=\u0422\u0438\u043F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.name=\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u0435 \u043A\u043B\u044E\u0447\u0438
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.description=\u041E\u0431\u043E\u0437\u043D\u0430\u0447\u0430\u0435\u0442, \u043A\u0430\u043A\u0438\u0435 \u0438\u043D\u0434\u0435\u043A\u0441\u044B \u043C\u043E\u0436\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C MySQL \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0432 \u044D\u0442\u043E\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u0435
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.name=\u041A\u043B\u044E\u0447
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.description=\u041A\u043B\u044E\u0447 (\u0438\u043D\u0434\u0435\u043A\u0441), \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 MySQL
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.name=\u0414\u043B\u0438\u043D\u0430 \u043A\u043B\u044E\u0447\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.description=\u0414\u043B\u0438\u043D\u0430 \u043A\u043B\u044E\u0447\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 MySQL
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.description=\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u043A\u0430\u043A\u0438\u0435 \u043A\u043E\u043B\u043E\u043D\u043A\u0438 \u0438\u043B\u0438 \u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B \u0441\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0441 \u0438\u043C\u0435\u043D\u0430\u043C\u0438 \u0432 \u0438\u043D\u0434\u0435\u043A\u0441\u0435 \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0439 \u043A\u043E\u043B\u043E\u043D\u043A\u0438 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u043A\u0435 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.name=\u0417\u0430\u043F\u0438\u0441\u0438
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.name=\u041E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u043E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.description=\u041E\u0446\u0435\u043D\u043E\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0446\u0435\u043D\u0442 \u0447\u0438\u0441\u043B\u0430 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u044B \u0443\u0441\u043B\u043E\u0432\u0438\u0435\u043C \u0442\u0430\u0431\u043B\u0438\u0446\u044B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.description=\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0442\u043E\u043C, \u043A\u0430\u043A MySQL \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043F\u0440\u043E\u0441
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.pid.description=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.user.name=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.user.description=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445
......
......@@ -135,28 +135,28 @@ meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.definition.name
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView$AdditionalInfo.updatable.name = \u53EF\u66F4\u65B0\u7684
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.name.name = \u89C6\u56FE\u540D\u79F0
meta.org.jkiss.dbeaver.ext.mysql.model.MySQLView.objectDefinitionText.name = \u5B9A\u4E49
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.description = \u5173\u4E8E MySQL \u5982\u4F55\u89E3\u51B3\u67E5\u8BE2\u7684\u989D\u5916\u4FE1\u606F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.extra.name = \u989D\u5916\u7684
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.description = \u5C06\u4F1A\u88AB\u8868\u6761\u4EF6\u8FC7\u6EE4\u6389\u7684\u8868\u884C\u7684\u4F30\u8BA1\u767E\u5206\u6BD4
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.filtered.name = \u8FC7\u6EE4\u7684
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.description = SELECT \u6807\u8BC6\u7B26\u3002\u8FD9\u662F\u67E5\u8BE2\u4E2D SELECT \u7684\u987A\u5E8F\u53F7\u7801
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.id.name = ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.description = MySQL \u5B9E\u9645\u4E0A\u51B3\u5B9A\u4F7F\u7528\u7684\u952E (\u7D22\u5F15)
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.key.name = \u952E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.description = MySQL \u51B3\u5B9A\u4F7F\u7528\u7684\u952E\u957F\u5EA6
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.keyLength.name = \u952E\u957F\u5EA6
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.description = \u8868\u540DMySQL\u53EF\u4EE5\u9009\u62E9\u7684\u7D22\u5F15\u7528\u4E8E\u67E5\u627E\u8868\u4E2D\u7684\u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.possibleKeys.name = \u53EF\u80FD\u7684\u952E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.description = \u663E\u793A\u54EA\u4E9B\u5217\u6216\u5E38\u6570\u4E0E\u547D\u540D\u5728\u952E\u5217\u4E2D\u7684\u7D22\u5F15\u76F8\u6BD4\u8F83\u6765\u4ECE\u8868\u4E2D\u9009\u62E9\u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.ref.name = \u53C2\u7167
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.description = MySQL \u8BA4\u4E3A\u5FC5\u987B\u7ECF\u68C0\u67E5\u6765\u6267\u884C\u67E5\u8BE2\u7684\u884C\u6570
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.rowCount.name = \u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.description = SELECT\u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.selectType.name = \u9009\u62E9\u7684\u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.description = \u8F93\u51FA\u884C\u53C2\u7167\u7684\u8868
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.table.name = \u8868
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.description = \u8054\u63A5\u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNode.nodeType.name = \u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.description = \u5173\u4E8E MySQL \u5982\u4F55\u89E3\u51B3\u67E5\u8BE2\u7684\u989D\u5916\u4FE1\u606F
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.extra.name = \u989D\u5916\u7684
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.description = \u5C06\u4F1A\u88AB\u8868\u6761\u4EF6\u8FC7\u6EE4\u6389\u7684\u8868\u884C\u7684\u4F30\u8BA1\u767E\u5206\u6BD4
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.filtered.name = \u8FC7\u6EE4\u7684
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.description = SELECT \u6807\u8BC6\u7B26\u3002\u8FD9\u662F\u67E5\u8BE2\u4E2D SELECT \u7684\u987A\u5E8F\u53F7\u7801
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.id.name = ID
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.description = MySQL \u5B9E\u9645\u4E0A\u51B3\u5B9A\u4F7F\u7528\u7684\u952E (\u7D22\u5F15)
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.key.name = \u952E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.description = MySQL \u51B3\u5B9A\u4F7F\u7528\u7684\u952E\u957F\u5EA6
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.keyLength.name = \u952E\u957F\u5EA6
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.description = \u8868\u540DMySQL\u53EF\u4EE5\u9009\u62E9\u7684\u7D22\u5F15\u7528\u4E8E\u67E5\u627E\u8868\u4E2D\u7684\u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.possibleKeys.name = \u53EF\u80FD\u7684\u952E
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.description = \u663E\u793A\u54EA\u4E9B\u5217\u6216\u5E38\u6570\u4E0E\u547D\u540D\u5728\u952E\u5217\u4E2D\u7684\u7D22\u5F15\u76F8\u6BD4\u8F83\u6765\u4ECE\u8868\u4E2D\u9009\u62E9\u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.ref.name = \u53C2\u7167
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.description = MySQL \u8BA4\u4E3A\u5FC5\u987B\u7ECF\u68C0\u67E5\u6765\u6267\u884C\u67E5\u8BE2\u7684\u884C\u6570
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.rowCount.name = \u884C
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.description = SELECT\u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.selectType.name = \u9009\u62E9\u7684\u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.description = \u8F93\u51FA\u884C\u53C2\u7167\u7684\u8868
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.table.name = \u8868
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.description = \u8054\u63A5\u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.plan.MySQLPlanNodePlain.nodeType.name = \u7C7B\u578B
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.command.description = \u5F53\u524D\u547D\u4EE4
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.command.name = \u547D\u4EE4
meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.db.description = \u6570\u636E\u5E93
......
......@@ -40,7 +40,7 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
private MySQLDataSource dataSource;
private String query;
private List<MySQLPlanNode> rootNodes;
private List<MySQLPlanNodePlain> rootNodes;
public MySQLPlanAnalyser(MySQLDataSource dataSource, String query) {
this.dataSource = dataSource;
......@@ -70,8 +70,8 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
if (CommonUtils.getOption(options, OPTION_KEEP_ORIGINAL)) {
return rootNodes;
} else {
List<MySQLPlanNode> rootCopy = new ArrayList<>(rootNodes.size());
for (MySQLPlanNode r : rootNodes) {
List<MySQLPlanNodePlain> rootCopy = new ArrayList<>(rootNodes.size());
for (MySQLPlanNodePlain r : rootNodes) {
rootCopy.add(r.copyNode(null));
}
return convertToPlanTree(rootCopy);
......@@ -88,9 +88,9 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
try {
try (JDBCPreparedStatement dbStat = connection.prepareStatement(getPlanQueryString())) {
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
List<MySQLPlanNode> nodes = new ArrayList<>();
List<MySQLPlanNodePlain> nodes = new ArrayList<>();
while (dbResult.next()) {
MySQLPlanNode node = new MySQLPlanNode(null, dbResult);
MySQLPlanNodePlain node = new MySQLPlanNodePlain(null, dbResult);
nodes.add(node);
}
......@@ -102,22 +102,22 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
}
}
private List<MySQLPlanNode> convertToPlanTree(List<MySQLPlanNode> srcNodes) {
List<MySQLPlanNode> roots = new ArrayList<>();
private List<MySQLPlanNodePlain> convertToPlanTree(List<MySQLPlanNodePlain> srcNodes) {
List<MySQLPlanNodePlain> roots = new ArrayList<>();
if (srcNodes.size() == 1) {
// Just one node
roots.add(srcNodes.get(0));
} else {
List<MySQLPlanNode> parsed = new ArrayList<>();
MySQLPlanNode lastCompositeNode = null;
List<MySQLPlanNodePlain> parsed = new ArrayList<>();
MySQLPlanNodePlain lastCompositeNode = null;
for (int id = 1; ; id++) {
List<MySQLPlanNode> nodes = getQueriesById(srcNodes, id);
List<MySQLPlanNodePlain> nodes = getQueriesById(srcNodes, id);
if (nodes.isEmpty()) {
break;
}
if (nodes.size() == 1) {
MySQLPlanNode firstNode = nodes.get(0);
MySQLPlanNodePlain firstNode = nodes.get(0);
if (lastCompositeNode != null) {
firstNode.setParent(lastCompositeNode);
} else {
......@@ -127,28 +127,35 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
lastCompositeNode = firstNode;
}
} else {
roots.add(joinNodes(srcNodes, nodes));
MySQLPlanNodePlain leftNode = lastCompositeNode;
if (leftNode == null) {
leftNode = nodes.get(0).getParent();
}
MySQLPlanNodePlain joinNode = joinNodes(srcNodes, leftNode, nodes);
if (leftNode == null) {
roots.add(joinNode);
}
}
parsed.addAll(nodes);
}
// Add the rest
for (MySQLPlanNode node : srcNodes) {
if (!parsed.contains(node)) {
for (MySQLPlanNodePlain node : srcNodes) {
if (node.getId() != null && !parsed.contains(node)) {
roots.add(node);
}
}
}
for (MySQLPlanNode node : roots) {
for (MySQLPlanNodePlain node : roots) {
node.computeStats();
}
return roots;
}
private List<MySQLPlanNode> getQueriesById(List<MySQLPlanNode> srcNodes, int id) {
List<MySQLPlanNode> subList = new ArrayList<>();
for (MySQLPlanNode node : srcNodes) {
private List<MySQLPlanNodePlain> getQueriesById(List<MySQLPlanNodePlain> srcNodes, int id) {
List<MySQLPlanNodePlain> subList = new ArrayList<>();
for (MySQLPlanNodePlain node : srcNodes) {
if (node.getId() != null && node.getId() == id) {
subList.add(node);
}
......@@ -156,11 +163,17 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
return subList;
}
private MySQLPlanNode joinNodes(List<MySQLPlanNode> srcNodes, List<MySQLPlanNode> nodes) {
//MySQLPlanNode result = null;
MySQLPlanNode leftNode = nodes.get(0);
private MySQLPlanNodePlain joinNodes(List<MySQLPlanNodePlain> srcNodes, MySQLPlanNodePlain parent, List<MySQLPlanNodePlain> nodes) {
MySQLPlanNodePlain leftNode = nodes.get(0);
for (int i = 1; i < nodes.size(); i++) {
leftNode = new MySQLPlanNodeJoin(leftNode.getParent(), leftNode, nodes.get(i));
MySQLPlanNodePlain rightNode = nodes.get(i);
MySQLPlanNodeJoin nodeJoin = new MySQLPlanNodeJoin(parent, leftNode, rightNode);
leftNode.setParent(nodeJoin);
rightNode.setParent(nodeJoin);
if (parent != null) {
nodeJoin.setParent(parent);
}
leftNode = nodeJoin;
}
return leftNode;
}
......
......@@ -17,241 +17,12 @@
package org.jkiss.dbeaver.ext.mysql.model.plan;
import org.jkiss.dbeaver.model.exec.plan.DBCPlanCostNode;
import org.jkiss.dbeaver.model.exec.plan.DBCPlanNodeKind;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.plan.AbstractExecutionPlanNode;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.utils.CommonUtils;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/**
* MySQL execution plan node
*/
public class MySQLPlanNode extends AbstractExecutionPlanNode implements DBCPlanCostNode {
protected Integer id;
protected String selectType;
protected String table;
protected String type;
protected String possibleKeys;
protected String key;
protected String keyLength;
protected String ref;
protected Long rowCount;
protected Long filtered;
protected String extra;
protected MySQLPlanNode parent;
protected List<MySQLPlanNode> nested;
public MySQLPlanNode(List<MySQLPlanNode> nodes) {
// Root node
type = "<plan>";
if (!nodes.isEmpty()) {
this.rowCount = nodes.get(0).rowCount;
}
this.nested = nodes;
}
public MySQLPlanNode(MySQLPlanNode parent, ResultSet dbResult) {
this.parent = parent;
this.id = JDBCUtils.safeGetInteger(dbResult, "id");
this.selectType = JDBCUtils.safeGetString(dbResult, "select_type");
this.table = JDBCUtils.safeGetString(dbResult, "table");
this.type = JDBCUtils.safeGetString(dbResult, "type");
this.possibleKeys = JDBCUtils.safeGetString(dbResult, "possible_keys");
this.key = JDBCUtils.safeGetString(dbResult, "key");
this.keyLength = JDBCUtils.safeGetString(dbResult, "key_len");
this.ref = JDBCUtils.safeGetString(dbResult, "ref");
this.rowCount = JDBCUtils.safeGetLongNullable(dbResult, "rows");
this.filtered = JDBCUtils.safeGetLongNullable(dbResult, "filtered");
this.extra = JDBCUtils.safeGetString(dbResult, "extra");
}
public MySQLPlanNode(MySQLPlanNode parent, String type) {
this.parent = parent;
this.type = type;
}
protected MySQLPlanNode(MySQLPlanNode parent, MySQLPlanNode source) {
this.id = source.id;
this.selectType = source.selectType;
this.table = source.table;
this.type = source.type;
this.possibleKeys = source.possibleKeys;
this.key = source.key;
this.keyLength = source.keyLength;
this.ref = source.ref;
this.rowCount = source.rowCount;
this.filtered = source.filtered;
this.extra = source.extra;
this.parent = parent;
if (source.nested != null) {
this.nested = new ArrayList<>(source.nested.size());
for (MySQLPlanNode srcNode : source.nested) {
this.nested.add(srcNode.copyNode(this));
}
}
}
@Override
public MySQLPlanNode getParent() {
return parent;
}
void setParent(MySQLPlanNode node) {
if (this.parent != null && this.parent.nested != null) {
this.parent.nested.remove(this);
}
this.parent = node;
if (this.parent != null) {
this.parent.addChild(this);
}
}
private void addChild(MySQLPlanNode node) {
if (this.nested == null) {
this.nested = new ArrayList<>();
}
this.nested.add(node);
}
@Override
public String getNodeName() {
return table;
}
@Override
public DBCPlanNodeKind getNodeKind() {
if ("SIMPLE".equals(selectType)) {
return DBCPlanNodeKind.SELECT;
} else if ("JOIN".equals(selectType)) {
return DBCPlanNodeKind.JOIN;
} else if ("UNION".equals(selectType)) {
return DBCPlanNodeKind.UNION;
}
return super.getNodeKind();
}
@Override
public String getNodeDescription() {
return ref;
}
@Override
@Property(order = 3, viewable = true)
public String getNodeType() {
return type;
}
@Override
public List<MySQLPlanNode> getNested() {
return nested;
}
* Abstract plan node
@Property(order = 0, viewable = true)
public Integer getId() {
return id;
}
@Property(order = 1, viewable = true)
public String getSelectType() {
return selectType;
}
@Property(order = 2, viewable = true)
public String getTable() {
return table;
}
@Property(order = 4, viewable = true)
public String getPossibleKeys() {
return possibleKeys;
}
@Property(order = 5, viewable = true)
public String getKey() {
return key;
}
@Property(order = 6, viewable = true)
public String getKeyLength() {
return keyLength;
}
@Property(order = 7, viewable = true)
public String getRef() {
return ref;
}
@Property(order = 8, viewable = true)
public Long getRowCount() {
return rowCount;
}
@Property(order = 9, viewable = true)
public Long getFiltered() {
return filtered;
}
@Property(order = 10, viewable = true)
public String getExtra() {
return extra;
}
@Override
public Number getNodeCost() {
return null;
}
@Override
public Number getNodePercent() {
return null;
}
@Override
public Number getNodeDuration() {
return null;
}
@Override
public Number getNodeRowCount() {
return rowCount;
}
public boolean isCompositeNode() {
return "PRIMARY".equals(selectType);
}
@Override
public String toString() {
return id + " " + selectType + " " + table;
}
void computeStats() {
if (rowCount == null) {
if (nested != null) {
long calcCount = 0;
for (MySQLPlanNode child : nested) {
calcCount += CommonUtils.toLong(child.getRowCount());
}
this.rowCount = calcCount;
}
}
if (nested != null) {
for (MySQLPlanNode child : nested) {
child.computeStats();
}
}
}
*/
public abstract class MySQLPlanNode extends AbstractExecutionPlanNode implements DBCPlanCostNode {
MySQLPlanNode copyNode(MySQLPlanNode parent) {
return new MySQLPlanNode(parent, this);
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ext.mysql.model.plan;
import org.jkiss.dbeaver.model.exec.plan.DBCPlanNodeKind;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.utils.CommonUtils;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/**
* MySQL execution plan node based on JSON format
*
* Select type:
*
SIMPLE – the query is a simple SELECT query without any subqueries or UNIONs
PRIMARY – the SELECT is in the outermost query in a JOIN
DERIVED – the SELECT is part of a subquery within a FROM clause
SUBQUERY – the first SELECT in a subquery
DEPENDENT SUBQUERY – a subquery which is dependent upon on outer query
UNCACHEABLE SUBQUERY – a subquery which is not cacheable (there are certain conditions for a query to be cacheable)
UNION – the SELECT is the second or later statement of a UNION
DEPENDENT UNION – the second or later SELECT of a UNION is dependent on an outer query
UNION RESULT – the SELECT is a result of a UNION
*/
public class MySQLPlanNodeJSON extends MySQLPlanNode {
protected Integer id;
protected String selectType;
protected String table;
protected String type;
protected String possibleKeys;
protected String key;
protected String keyLength;
protected String ref;
protected Long rowCount;
protected Long filtered;
protected String extra;
protected MySQLPlanNodeJSON parent;
protected List<MySQLPlanNodeJSON> nested;
public MySQLPlanNodeJSON(List<MySQLPlanNodeJSON> nodes) {
// Root node
type = "<plan>";
if (!nodes.isEmpty()) {
this.rowCount = nodes.get(0).rowCount;
}
this.nested = nodes;
}
public MySQLPlanNodeJSON(MySQLPlanNodeJSON parent, ResultSet dbResult) {
this.parent = parent;
this.id = JDBCUtils.safeGetInteger(dbResult, "id");
this.selectType = JDBCUtils.safeGetString(dbResult, "select_type");
this.table = JDBCUtils.safeGetString(dbResult, "table");
this.type = JDBCUtils.safeGetString(dbResult, "type");
this.possibleKeys = JDBCUtils.safeGetString(dbResult, "possible_keys");
this.key = JDBCUtils.safeGetString(dbResult, "key");
this.keyLength = JDBCUtils.safeGetString(dbResult, "key_len");
this.ref = JDBCUtils.safeGetString(dbResult, "ref");
this.rowCount = JDBCUtils.safeGetLongNullable(dbResult, "rows");
this.filtered = JDBCUtils.safeGetLongNullable(dbResult, "filtered");
this.extra = JDBCUtils.safeGetString(dbResult, "extra");
}
public MySQLPlanNodeJSON(MySQLPlanNodeJSON parent, String type) {
this.parent = parent;
this.selectType = type;
}
protected MySQLPlanNodeJSON(MySQLPlanNodeJSON parent, MySQLPlanNodeJSON source) {
this.id = source.id;
this.selectType = source.selectType;
this.table = source.table;
this.type = source.type;
this.possibleKeys = source.possibleKeys;
this.key = source.key;
this.keyLength = source.keyLength;
this.ref = source.ref;
this.rowCount = source.rowCount;
this.filtered = source.filtered;
this.extra = source.extra;
this.parent = parent;
if (source.nested != null) {
this.nested = new ArrayList<>(source.nested.size());
for (MySQLPlanNodeJSON srcNode : source.nested) {
this.nested.add(srcNode.copyNode(this));
}
}
}
@Override
public MySQLPlanNodeJSON getParent() {
return parent;
}
void setParent(MySQLPlanNodeJSON node) {
if (this.parent != null && this.parent.nested != null) {
this.parent.nested.remove(this);
}
this.parent = node;
if (this.parent != null) {
this.parent.addChild(this);
}
}
private void addChild(MySQLPlanNodeJSON node) {
if (this.nested == null) {
this.nested = new ArrayList<>();
}
this.nested.add(node);
}
@Override
public String getNodeName() {
return table;
}
@Override
public DBCPlanNodeKind getNodeKind() {
if ("SIMPLE".equals(selectType)) {
return DBCPlanNodeKind.SELECT;
} else if ("JOIN".equals(selectType)) {
return DBCPlanNodeKind.JOIN;
} else if ("UNION".equals(selectType)) {
return DBCPlanNodeKind.UNION;
}
return super.getNodeKind();
}
@Override
public String getNodeDescription() {
return ref;
}
@Override
@Property(order = 3, viewable = true)
public String getNodeType() {
return selectType;
}
@Override
public List<MySQLPlanNodeJSON> getNested() {
return nested;
}
@Property(order = 0, viewable = true)
public Integer getId() {
return id;
}
@Property(order = 1, viewable = true)
public String getSelectType() {
return selectType;
}
@Property(order = 2, viewable = true)
public String getTable() {
return table;
}
@Property(order = 4, viewable = true)
public String getPossibleKeys() {
return possibleKeys;
}
@Property(order = 5, viewable = true)
public String getKey() {
return key;
}
@Property(order = 6, viewable = true)
public String getKeyLength() {
return keyLength;
}
@Property(order = 7, viewable = true)
public String getRef() {
return ref;
}
@Property(order = 8, viewable = true)
public Long getRowCount() {
return rowCount;
}
@Property(order = 9, viewable = true)
public Long getFiltered() {
return filtered;
}
@Property(order = 10, viewable = true)
public String getExtra() {
return extra;
}
@Override
public Number getNodeCost() {
return null;
}
@Override
public Number getNodePercent() {
return null;
}
@Override
public Number getNodeDuration() {
return null;
}
@Override
public Number getNodeRowCount() {
return rowCount;
}
public boolean isCompositeNode() {
return "PRIMARY".equals(selectType);
}
@Override
public String toString() {
return id + " " + selectType + " " + table;
}
void computeStats() {
if (nested != null) {
for (MySQLPlanNodeJSON child : nested) {
child.computeStats();
}
}
if (rowCount == null) {
if (nested != null) {
long calcCount = 0;
for (MySQLPlanNodeJSON child : nested) {
child.computeStats();
calcCount += CommonUtils.toLong(child.getRowCount());
}
this.rowCount = calcCount;
}
}
}
MySQLPlanNodeJSON copyNode(MySQLPlanNodeJSON parent) {
return new MySQLPlanNodeJSON(parent, this);
}
}
......@@ -16,23 +16,14 @@
*/
package org.jkiss.dbeaver.ext.mysql.model.plan;
import org.jkiss.dbeaver.model.exec.plan.DBCPlanCostNode;
import org.jkiss.dbeaver.model.exec.plan.DBCPlanNode;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.plan.AbstractExecutionPlanNode;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.utils.CommonUtils;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/**
* MySQL execution plan node
*/
public class MySQLPlanNodeJoin extends MySQLPlanNode {
public class MySQLPlanNodeJoin extends MySQLPlanNodePlain {
public MySQLPlanNodeJoin(MySQLPlanNode parent, MySQLPlanNode left, MySQLPlanNode right) {
public MySQLPlanNodeJoin(MySQLPlanNodePlain parent, MySQLPlanNodePlain left, MySQLPlanNodePlain right) {
super(parent, "JOIN");
this.id = left.id;
this.nested = new ArrayList<>(2);
......@@ -42,12 +33,12 @@ public class MySQLPlanNodeJoin extends MySQLPlanNode {
right.parent = this;
}
public MySQLPlanNodeJoin(MySQLPlanNode parent, MySQLPlanNodeJoin source) {
public MySQLPlanNodeJoin(MySQLPlanNodePlain parent, MySQLPlanNodeJoin source) {
super(parent, source);
}
@Override
MySQLPlanNode copyNode(MySQLPlanNode parent) {
MySQLPlanNodePlain copyNode(MySQLPlanNodePlain parent) {
return new MySQLPlanNodeJoin(parent, this);
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ext.mysql.model.plan;
import org.jkiss.dbeaver.model.exec.plan.DBCPlanCostNode;
import org.jkiss.dbeaver.model.exec.plan.DBCPlanNodeKind;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.plan.AbstractExecutionPlanNode;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.utils.CommonUtils;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/**
* MySQL execution plan node.
*
* Select type:
*
SIMPLE – the query is a simple SELECT query without any subqueries or UNIONs
PRIMARY – the SELECT is in the outermost query in a JOIN
DERIVED – the SELECT is part of a subquery within a FROM clause
SUBQUERY – the first SELECT in a subquery
DEPENDENT SUBQUERY – a subquery which is dependent upon on outer query
UNCACHEABLE SUBQUERY – a subquery which is not cacheable (there are certain conditions for a query to be cacheable)
UNION – the SELECT is the second or later statement of a UNION
DEPENDENT UNION – the second or later SELECT of a UNION is dependent on an outer query
UNION RESULT – the SELECT is a result of a UNION
*/
public class MySQLPlanNodePlain extends MySQLPlanNode {
protected Integer id;
protected String selectType;
protected String table;
protected String type;
protected String possibleKeys;
protected String key;
protected String keyLength;
protected String ref;
protected Long rowCount;
protected Long filtered;
protected String extra;
protected MySQLPlanNodePlain parent;
protected List<MySQLPlanNodePlain> nested;
public MySQLPlanNodePlain(List<MySQLPlanNodePlain> nodes) {
// Root node
type = "<plan>";
if (!nodes.isEmpty()) {
this.rowCount = nodes.get(0).rowCount;
}
this.nested = nodes;
}
public MySQLPlanNodePlain(MySQLPlanNodePlain parent, ResultSet dbResult) {
this.parent = parent;
this.id = JDBCUtils.safeGetInteger(dbResult, "id");
this.selectType = JDBCUtils.safeGetString(dbResult, "select_type");
this.table = JDBCUtils.safeGetString(dbResult, "table");
this.type = JDBCUtils.safeGetString(dbResult, "type");
this.possibleKeys = JDBCUtils.safeGetString(dbResult, "possible_keys");
this.key = JDBCUtils.safeGetString(dbResult, "key");
this.keyLength = JDBCUtils.safeGetString(dbResult, "key_len");
this.ref = JDBCUtils.safeGetString(dbResult, "ref");
this.rowCount = JDBCUtils.safeGetLongNullable(dbResult, "rows");
this.filtered = JDBCUtils.safeGetLongNullable(dbResult, "filtered");
this.extra = JDBCUtils.safeGetString(dbResult, "extra");
}
public MySQLPlanNodePlain(MySQLPlanNodePlain parent, String type) {
this.parent = parent;
this.selectType = type;
}
protected MySQLPlanNodePlain(MySQLPlanNodePlain parent, MySQLPlanNodePlain source) {
this.id = source.id;
this.selectType = source.selectType;
this.table = source.table;
this.type = source.type;
this.possibleKeys = source.possibleKeys;
this.key = source.key;
this.keyLength = source.keyLength;
this.ref = source.ref;
this.rowCount = source.rowCount;
this.filtered = source.filtered;
this.extra = source.extra;
this.parent = parent;
if (source.nested != null) {
this.nested = new ArrayList<>(source.nested.size());
for (MySQLPlanNodePlain srcNode : source.nested) {
this.nested.add(srcNode.copyNode(this));
}
}
}
@Override
public MySQLPlanNodePlain getParent() {
return parent;
}
void setParent(MySQLPlanNodePlain node) {
if (this.parent != null && this.parent.nested != null) {
this.parent.nested.remove(this);
}
this.parent = node;
if (this.parent != null) {
this.parent.addChild(this);
}
}
private void addChild(MySQLPlanNodePlain node) {
if (this.nested == null) {
this.nested = new ArrayList<>();
}
this.nested.add(node);
}
@Override
public String getNodeName() {
return table;
}
@Override
public DBCPlanNodeKind getNodeKind() {
if ("SIMPLE".equals(selectType)) {
return DBCPlanNodeKind.SELECT;
} else if ("JOIN".equals(selectType)) {
return DBCPlanNodeKind.JOIN;
} else if ("UNION".equals(selectType)) {
return DBCPlanNodeKind.UNION;
}
return super.getNodeKind();
}
@Override
public String getNodeDescription() {
return ref;
}
@Override
@Property(order = 3, viewable = true)
public String getNodeType() {
return selectType;
}
@Override
public List<MySQLPlanNodePlain> getNested() {
return nested;
}
@Property(order = 0, viewable = true)
public Integer getId() {
return id;
}
@Property(order = 1, viewable = true)
public String getSelectType() {
return selectType;
}
@Property(order = 2, viewable = true)
public String getTable() {
return table;
}
@Property(order = 4, viewable = true)
public String getPossibleKeys() {
return possibleKeys;
}
@Property(order = 5, viewable = true)
public String getKey() {
return key;
}
@Property(order = 6, viewable = true)
public String getKeyLength() {
return keyLength;
}
@Property(order = 7, viewable = true)
public String getRef() {
return ref;
}
@Property(order = 8, viewable = true)
public Long getRowCount() {
return rowCount;
}
@Property(order = 9, viewable = true)
public Long getFiltered() {
return filtered;
}
@Property(order = 10, viewable = true)
public String getExtra() {
return extra;
}
@Override
public Number getNodeCost() {
return null;
}
@Override
public Number getNodePercent() {
return null;
}
@Override
public Number getNodeDuration() {
return null;
}
@Override
public Number getNodeRowCount() {
return rowCount;
}
public boolean isCompositeNode() {
return "PRIMARY".equals(selectType);
}
@Override
public String toString() {
return id + " " + selectType + " " + table;
}
void computeStats() {
if (nested != null) {
for (MySQLPlanNodePlain child : nested) {
child.computeStats();
}
}
if (rowCount == null) {
if (nested != null) {
long calcCount = 0;
for (MySQLPlanNodePlain child : nested) {
child.computeStats();
calcCount += CommonUtils.toLong(child.getRowCount());
}
this.rowCount = calcCount;
}
}
}
MySQLPlanNodePlain copyNode(MySQLPlanNodePlain parent) {
return new MySQLPlanNodePlain(parent, this);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册