diff --git a/jOOQ/src/main/java/org/jooq/ParserCLI.java b/jOOQ/src/main/java/org/jooq/ParserCLI.java index d76e2f56d2..6f8dd063bb 100644 --- a/jOOQ/src/main/java/org/jooq/ParserCLI.java +++ b/jOOQ/src/main/java/org/jooq/ParserCLI.java @@ -45,6 +45,7 @@ import java.util.regex.Pattern; import org.jooq.conf.RenderKeywordCase; import org.jooq.conf.RenderNameCase; +import org.jooq.conf.RenderOptionalKeyword; import org.jooq.conf.RenderQuotedNames; import org.jooq.conf.Settings; import org.jooq.conf.TransformUnneededArithmeticExpressions; @@ -101,6 +102,14 @@ public final class ParserCLI { settings.setParseDialect(a.fromDialect); if (a.renderCoalesceToEmptyStringInConcat) settings.setRenderCoalesceToEmptyStringInConcat(true); + if (a.renderOptionalInnerKeyword != null) + settings.setRenderOptionalInnerKeyword(a.renderOptionalInnerKeyword); + if (a.renderOptionalOuterKeyword != null) + settings.setRenderOptionalOuterKeyword(a.renderOptionalOuterKeyword); + if (a.renderOptionalAsKeywordForFieldAliases != null) + settings.setRenderOptionalAsKeywordForFieldAliases(a.renderOptionalAsKeywordForFieldAliases); + if (a.renderOptionalAsKeywordForTableAliases != null) + settings.setRenderOptionalAsKeywordForTableAliases(a.renderOptionalAsKeywordForTableAliases); if (a.transformAnsiJoinToTableLists) settings.setTransformAnsiJoinToTableLists(true); if (a.transformTableListsToAnsiJoin) @@ -166,50 +175,50 @@ public final class ParserCLI { displayFormatted(a); } - else if ("k".equals(flag) || "keyword".equals(flag)) { + else if ("k".equals(flag) || "keyword".equals(flag)) a.keywords = parseInteractive(RenderKeywordCase.class, a.keywords, arg, () -> displayKeywords(a)); - } - else if ("i".equals(flag) || "identifier".equals(flag)) { + else if ("i".equals(flag) || "identifier".equals(flag)) a.name = parseInteractive(RenderNameCase.class, a.name, arg, () -> displayIdentifiers(a)); - } - else if ("Q".equals(flag) || "quoted".equals(flag)) { + else if ("Q".equals(flag) || "quoted".equals(flag)) a.quoted = parseInteractive(RenderQuotedNames.class, a.quoted, arg, () -> displayQuoted(a)); - } - else if ("F".equals(flag) || "from-dialect".equals(flag)) { + else if ("F".equals(flag) || "from-dialect".equals(flag)) a.fromDialect = parseInteractive(SQLDialect.class, a.fromDialect, arg, () -> displayFromDialect(a)); - } else if ("render-coalesce-to-empty-string-in-concat".equals(flag)) { if (arg != null) a.renderCoalesceToEmptyStringInConcat = Boolean.parseBoolean(arg.toLowerCase()); displayRenderCoalesceToEmptyStringInConcat(a); } + else if ("render-optional-inner-keyword".equals(flag)) + a.renderOptionalInnerKeyword = parseInteractive(RenderOptionalKeyword.class, a.renderOptionalInnerKeyword, arg, () -> displayRenderOptionalInnerKeyword(a)); + else if ("render-optional-outer-keyword".equals(flag)) + a.renderOptionalOuterKeyword = parseInteractive(RenderOptionalKeyword.class, a.renderOptionalOuterKeyword, arg, () -> displayRenderOptionalOuterKeyword(a)); + else if ("render-optional-as-keyword-for-field-aliases".equals(flag)) + a.renderOptionalAsKeywordForFieldAliases = parseInteractive(RenderOptionalKeyword.class, a.renderOptionalAsKeywordForFieldAliases, arg, () -> displayRenderOptionalAsKeywordForFieldAliases(a)); + else if ("render-optional-as-keyword-for-table-aliases".equals(flag)) + a.renderOptionalAsKeywordForTableAliases = parseInteractive(RenderOptionalKeyword.class, a.renderOptionalAsKeywordForTableAliases, arg, () -> displayRenderOptionalAsKeywordForTableAliases(a)); else if ("transform-ansi-join-to-table-lists".equals(flag)) { if (arg != null) a.transformAnsiJoinToTableLists = Boolean.parseBoolean(arg.toLowerCase()); displayTransformAnsiJoinToTablesLists(a); } - else if ("transform-qualify".equals(flag)) { + else if ("transform-qualify".equals(flag)) a.transformQualify = parseInteractive(Transformation.class, a.transformQualify, arg, () -> displayTransformQualify(a)); - } - else if ("transform-rownum".equals(flag)) { + else if ("transform-rownum".equals(flag)) a.transformRownum = parseInteractive(Transformation.class, a.transformRownum, arg, () -> displayTransformRownum(a)); - } else if ("transform-table-lists-to-ansi-join".equals(flag)) { if (arg != null) a.transformTableListsToAnsiJoin = Boolean.parseBoolean(arg.toLowerCase()); displayTransformTableListsToAnsiJoin(a); } - else if ("transform-unneeded-arithmetic".equals(flag)) { + else if ("transform-unneeded-arithmetic".equals(flag)) a.transformUnneededArithmetic = parseInteractive(TransformUnneededArithmeticExpressions.class, a.transformUnneededArithmetic, arg, () -> displayTransformUnneededArithmetic(a)); - } // [#9144] /t maintained for backwards compatibility - else if ("t".equals(flag) || "T".equals(flag) || "to-dialect".equals(flag)) { + else if ("t".equals(flag) || "T".equals(flag) || "to-dialect".equals(flag)) a.toDialect = parseInteractive(SQLDialect.class, a.toDialect, arg, () -> displayToDialect(a)); - } } } else { @@ -282,6 +291,22 @@ public final class ParserCLI { System.out.println("Render COALESCE(X, '') in CONCAT : " + a.renderCoalesceToEmptyStringInConcat); } + private static void displayRenderOptionalInnerKeyword(Args a) { + System.out.println("Render INNER keyword in INNER JOIN : " + a.renderOptionalInnerKeyword); + } + + private static void displayRenderOptionalOuterKeyword(Args a) { + System.out.println("Render OUTER keyword in OUTER JOIN : " + a.renderOptionalOuterKeyword); + } + + private static void displayRenderOptionalAsKeywordForFieldAliases(Args a) { + System.out.println("Render AS keyword to alias fields :" + a.renderOptionalAsKeywordForFieldAliases); + } + + private static void displayRenderOptionalAsKeywordForTableAliases(Args a) { + System.out.println("Render AS keyword to alias tables :" + a.renderOptionalAsKeywordForTableAliases); + } + private static void displayTransformAnsiJoinToTablesLists(Args a) { System.out.println("Transform ANSI join to table lists : " + a.transformAnsiJoinToTableLists); } @@ -349,50 +374,44 @@ public final class ParserCLI { Class> enumArgument = null; try { - if ("-f".equals(args[i]) || "--formatted".equals(args[i])) { + if ("-f".equals(args[i]) || "--formatted".equals(args[i])) result.formatted = true; - } - else if ("-k".equals(args[i]) || "--keyword".equals(args[i])) { + else if ("-k".equals(args[i]) || "--keyword".equals(args[i])) result.keywords = parse((Class) (enumArgument = RenderKeywordCase.class), args[++i]); - } - else if ("-i".equals(args[i]) || "--identifier".equals(args[i])) { + else if ("-i".equals(args[i]) || "--identifier".equals(args[i])) result.name = parse((Class) (enumArgument = RenderNameCase.class), args[++i]); - } - else if ("-Q".equals(args[i]) || "--quoted".equals(args[i])) { + else if ("-Q".equals(args[i]) || "--quoted".equals(args[i])) result.quoted = parse((Class) (enumArgument = RenderQuotedNames.class), args[++i]); - } - else if ("-F".equals(args[i]) || "--from-dialect".equals(args[i])) { + else if ("-F".equals(args[i]) || "--from-dialect".equals(args[i])) result.fromDialect = parse((Class) (enumArgument = SQLDialect.class), args[++i]); - } // [#9144] -t maintained for backwards compatibility - else if ("-t".equals(args[i]) || "-T".equals(args[i]) || "--to-dialect".equals(args[i])) { + else if ("-t".equals(args[i]) || "-T".equals(args[i]) || "--to-dialect".equals(args[i])) result.toDialect = parse((Class) (enumArgument = SQLDialect.class), args[++i]); - } - else if ("--render-coalesce-to-empty-string-in-concat".equals(args[i])) { + else if ("--render-coalesce-to-empty-string-in-concat".equals(args[i])) result.renderCoalesceToEmptyStringInConcat = true; - } - else if ("--transform-ansi-join-to-table-lists".equals(args[i])) { + else if ("--render-optional-inner-keyword".equals(args[i])) + result.renderOptionalInnerKeyword = parse((Class) (enumArgument = RenderOptionalKeyword.class), args[++i]); + else if ("--render-optional-outer-keyword".equals(args[i])) + result.renderOptionalOuterKeyword = parse((Class) (enumArgument = RenderOptionalKeyword.class), args[++i]); + else if ("--render-optional-as-keyword-for-field-aliases".equals(args[i])) + result.renderOptionalAsKeywordForFieldAliases = parse((Class) (enumArgument = RenderOptionalKeyword.class), args[++i]); + else if ("--render-optional-as-keyword-for-table-aliases".equals(args[i])) + result.renderOptionalAsKeywordForTableAliases = parse((Class) (enumArgument = RenderOptionalKeyword.class), args[++i]); + else if ("--transform-ansi-join-to-table-lists".equals(args[i])) result.transformAnsiJoinToTableLists = true; - } - else if ("--transform-qualify".equals(args[i])) { + else if ("--transform-qualify".equals(args[i])) result.transformQualify = parse((Class) (enumArgument = Transformation.class), args[++i]); - } - else if ("--transform-rownum".equals(args[i])) { + else if ("--transform-rownum".equals(args[i])) result.transformRownum = parse((Class) (enumArgument = Transformation.class), args[++i]); - } - else if ("--transform-table-lists-to-ansi-join".equals(args[i])) { + else if ("--transform-table-lists-to-ansi-join".equals(args[i])) result.transformTableListsToAnsiJoin = true; - } - else if ("--transform-unneeded-arithmetic".equals(args[i])) { + else if ("--transform-unneeded-arithmetic".equals(args[i])) result.transformUnneededArithmetic = parse((Class) (enumArgument = TransformUnneededArithmeticExpressions.class), args[++i]); - } - else if ("-s".equals(args[i]) || "--sql".equals(args[i])) { + else if ("-s".equals(args[i]) || "--sql".equals(args[i])) result.sql = args[++i]; - } - else if ("-I".equals(args[i]) || "--interactive".equals(args[i])) { + else if ("-I".equals(args[i]) || "--interactive".equals(args[i])) result.interactive = true; - } else if ("-h".equals(args[i]) || "--help".equals(args[i])) { help(); result.done = true; @@ -421,48 +440,56 @@ public final class ParserCLI { private static final void help() { System.out.println("Usage:"); - System.out.println(" -f / --formatted Format output SQL"); - System.out.println(" -h / --help Display this help"); - System.out.println(" -k / --keyword Specify the output keyword case (org.jooq.conf.RenderKeywordCase)"); - System.out.println(" -i / --identifier Specify the output identifier case (org.jooq.conf.RenderNameCase)"); - System.out.println(" -Q / --quoted Specify the output identifier quoting (org.jooq.conf.RenderQuotedNames)"); - System.out.println(" -F / --from-dialect Specify the input dialect (org.jooq.SQLDialect)"); - System.out.println(" -T / --to-dialect Specify the output dialect (org.jooq.SQLDialect)"); - System.out.println(" -s / --sql Specify the input SQL string"); + System.out.println(" -f / --formatted Format output SQL"); + System.out.println(" -h / --help Display this help"); + System.out.println(" -k / --keyword Specify the output keyword case (org.jooq.conf.RenderKeywordCase)"); + System.out.println(" -i / --identifier Specify the output identifier case (org.jooq.conf.RenderNameCase)"); + System.out.println(" -Q / --quoted Specify the output identifier quoting (org.jooq.conf.RenderQuotedNames)"); + System.out.println(" -F / --from-dialect Specify the input dialect (org.jooq.SQLDialect)"); + System.out.println(" -T / --to-dialect Specify the output dialect (org.jooq.SQLDialect)"); + System.out.println(" -s / --sql Specify the input SQL string"); System.out.println(""); System.out.println("Commercial distribution only features:"); - System.out.println(" --render-coalesce-to-empty-string-in-concat "); - System.out.println(" --transform-ansi-join-to-table-lists "); - System.out.println(" --transform-qualify "); - System.out.println(" --transform-rownum "); - System.out.println(" --transform-table-lists-to-ansi-join "); - System.out.println(" --transform-unneeded-arithmetic "); + System.out.println(" --render-coalesce-to-empty-string-in-concat "); + System.out.println(" --render-optional-inner-keyword "); + System.out.println(" --render-optional-outer-keyword "); + System.out.println(" --render-optional-as-keyword-for-field-aliases "); + System.out.println(" --render-optional-as-keyword-for-table-aliases "); + System.out.println(" --transform-ansi-join-to-table-lists "); + System.out.println(" --transform-qualify "); + System.out.println(" --transform-rownum "); + System.out.println(" --transform-table-lists-to-ansi-join "); + System.out.println(" --transform-unneeded-arithmetic "); System.out.println(""); System.out.println(" -I / --interactive Start interactive mode"); } private static final void helpInteractive() { System.out.println("Usage:"); - System.out.println(" /d or /display Display arguments"); - System.out.println(" /f or /formatted Format output SQL"); - System.out.println(" /h or /help Display this help"); - System.out.println(" /k or /keyword Specify the output keyword case (org.jooq.conf.RenderKeywordCase)"); - System.out.println(" /i or /identifier Specify the output identifier case (org.jooq.conf.RenderNameCase)"); - System.out.println(" /Q or /quoted Specify the output identifier quoting (org.jooq.conf.RenderQuotedNames)"); - System.out.println(" /F or /from-dialect Specify the input dialect (org.jooq.SQLDialect)"); - System.out.println(" /T or /to-dialect Specify the output dialect (org.jooq.SQLDialect)"); - System.out.println(" Specify the input SQL string"); + System.out.println(" /d or /display Display arguments"); + System.out.println(" /f or /formatted Format output SQL"); + System.out.println(" /h or /help Display this help"); + System.out.println(" /k or /keyword Specify the output keyword case (org.jooq.conf.RenderKeywordCase)"); + System.out.println(" /i or /identifier Specify the output identifier case (org.jooq.conf.RenderNameCase)"); + System.out.println(" /Q or /quoted Specify the output identifier quoting (org.jooq.conf.RenderQuotedNames)"); + System.out.println(" /F or /from-dialect Specify the input dialect (org.jooq.SQLDialect)"); + System.out.println(" /T or /to-dialect Specify the output dialect (org.jooq.SQLDialect)"); + System.out.println(" Specify the input SQL string"); System.out.println(""); System.out.println("Commercial distribution only features:"); - System.out.println(" /render-coalesce-to-empty-string-in-concat "); - System.out.println(" /transform-ansi-join-to-table-lists "); - System.out.println(" /transform-qualify "); - System.out.println(" /transform-rownum "); - System.out.println(" /transform-table-lists-to-ansi-join "); - System.out.println(" /transform-unneeded-arithmetic "); + System.out.println(" /render-coalesce-to-empty-string-in-concat "); + System.out.println(" /render-optional-inner-keyword "); + System.out.println(" /render-optional-outer-keyword "); + System.out.println(" /render-optional-as-keyword-for-field-aliases "); + System.out.println(" /render-optional-as-keyword-for-table-aliases "); + System.out.println(" /transform-ansi-join-to-table-lists "); + System.out.println(" /transform-qualify "); + System.out.println(" /transform-rownum "); + System.out.println(" /transform-table-lists-to-ansi-join "); + System.out.println(" /transform-unneeded-arithmetic "); System.out.println(""); - System.out.println(" /q or /quit Quit"); - System.out.println(" /e or /exit Also quit"); + System.out.println(" /q or /quit Quit"); + System.out.println(" /e or /exit Also quit"); } public static final class Args { @@ -477,6 +504,10 @@ public final class ParserCLI { boolean interactive; boolean done; boolean renderCoalesceToEmptyStringInConcat; + RenderOptionalKeyword renderOptionalInnerKeyword = RenderOptionalKeyword.DEFAULT; + RenderOptionalKeyword renderOptionalOuterKeyword = RenderOptionalKeyword.DEFAULT; + RenderOptionalKeyword renderOptionalAsKeywordForFieldAliases = RenderOptionalKeyword.DEFAULT; + RenderOptionalKeyword renderOptionalAsKeywordForTableAliases = RenderOptionalKeyword.DEFAULT; boolean transformAnsiJoinToTableLists; Transformation transformQualify; Transformation transformRownum; diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index a6071afa8b..0e9889d584 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -356,6 +356,9 @@ implements + + +