|
15 | 15 | import java.util.Arrays; |
16 | 16 | import java.util.Collection; |
17 | 17 | import java.util.Collections; |
| 18 | +import java.util.EnumSet; |
18 | 19 | import java.util.Iterator; |
19 | 20 | import java.util.List; |
20 | 21 | import java.util.Optional; |
| 22 | +import java.util.Set; |
21 | 23 | import net.sf.jsqlparser.expression.Alias; |
22 | 24 | import net.sf.jsqlparser.expression.Expression; |
23 | 25 | import net.sf.jsqlparser.expression.OracleHierarchicalExpression; |
@@ -45,14 +47,13 @@ public class PlainSelect extends Select { |
45 | 47 | private Expression qualify; |
46 | 48 | private OptimizeFor optimizeFor; |
47 | 49 | private Skip skip; |
48 | | - private boolean mySqlHintStraightJoin; |
| 50 | + private final EnumSet<MySqlSelectModifier> mySqlSelectModifiers = |
| 51 | + EnumSet.noneOf(MySqlSelectModifier.class); |
49 | 52 | private First first; |
50 | 53 | private Top top; |
51 | 54 | private OracleHierarchicalExpression oracleHierarchical = null; |
52 | 55 | private PreferringClause preferringClause = null; |
53 | 56 | private OracleHint oracleHint = null; |
54 | | - private boolean mySqlSqlCalcFoundRows = false; |
55 | | - private MySqlSqlCacheFlags mySqlCacheFlag = null; |
56 | 57 | private String forXmlPath; |
57 | 58 | private KSQLWindow ksqlWindow = null; |
58 | 59 | private EmitMode emitMode = EmitMode.NONE; |
@@ -397,11 +398,11 @@ public void setSkip(Skip skip) { |
397 | 398 | } |
398 | 399 |
|
399 | 400 | public boolean getMySqlHintStraightJoin() { |
400 | | - return this.mySqlHintStraightJoin; |
| 401 | + return mySqlSelectModifiers.contains(MySqlSelectModifier.STRAIGHT_JOIN); |
401 | 402 | } |
402 | 403 |
|
403 | 404 | public void setMySqlHintStraightJoin(boolean mySqlHintStraightJoin) { |
404 | | - this.mySqlHintStraightJoin = mySqlHintStraightJoin; |
| 405 | + setMySqlSelectModifier(MySqlSelectModifier.STRAIGHT_JOIN, mySqlHintStraightJoin); |
405 | 406 | } |
406 | 407 |
|
407 | 408 | public First getFirst() { |
@@ -616,15 +617,11 @@ private void appendSelectClauseTo(StringBuilder builder) { |
616 | 617 | builder.append("SELECT "); |
617 | 618 | appendSelectHintsTo(builder); |
618 | 619 | appendSelectQualifiersTo(builder); |
619 | | - appendMySqlSelectFlagsTo(builder); |
| 620 | + appendMySqlSelectModifiersTo(builder); |
620 | 621 | builder.append(getStringList(selectItems)); |
621 | 622 | } |
622 | 623 |
|
623 | 624 | private void appendSelectHintsTo(StringBuilder builder) { |
624 | | - if (this.mySqlHintStraightJoin) { |
625 | | - builder.append("STRAIGHT_JOIN "); |
626 | | - } |
627 | | - |
628 | 625 | if (oracleHint != null) { |
629 | 626 | builder.append(oracleHint).append(" "); |
630 | 627 | } |
@@ -659,13 +656,48 @@ private void appendSelectQualifiersTo(StringBuilder builder) { |
659 | 656 | } |
660 | 657 | } |
661 | 658 |
|
662 | | - private void appendMySqlSelectFlagsTo(StringBuilder builder) { |
663 | | - if (mySqlCacheFlag != null) { |
664 | | - builder.append(mySqlCacheFlag.name()).append(" "); |
| 659 | + /** Appends the typed modifiers in MySQL's documented SELECT order. */ |
| 660 | + public void appendMySqlSelectModifiersTo(StringBuilder builder) { |
| 661 | + for (MySqlSelectModifier modifier : mySqlSelectModifiers) { |
| 662 | + builder.append(modifier).append(" "); |
665 | 663 | } |
| 664 | + } |
| 665 | + |
| 666 | + /** Returns the modifiers independently of the selected expressions and aliases. */ |
| 667 | + public Set<MySqlSelectModifier> getMySqlSelectModifiers() { |
| 668 | + return Collections.unmodifiableSet(mySqlSelectModifiers); |
| 669 | + } |
| 670 | + |
| 671 | + public void setMySqlSelectModifiers(Collection<MySqlSelectModifier> modifiers) { |
| 672 | + EnumSet<MySqlSelectModifier> copy = EnumSet.noneOf(MySqlSelectModifier.class); |
| 673 | + if (modifiers != null) { |
| 674 | + copy.addAll(modifiers); |
| 675 | + } |
| 676 | + if (copy.contains(MySqlSelectModifier.SQL_CACHE) |
| 677 | + && copy.contains(MySqlSelectModifier.SQL_NO_CACHE)) { |
| 678 | + throw new IllegalArgumentException("SQL_CACHE and SQL_NO_CACHE cannot be combined"); |
| 679 | + } |
| 680 | + mySqlSelectModifiers.clear(); |
| 681 | + mySqlSelectModifiers.addAll(copy); |
| 682 | + } |
666 | 683 |
|
667 | | - if (mySqlSqlCalcFoundRows) { |
668 | | - builder.append("SQL_CALC_FOUND_ROWS").append(" "); |
| 684 | + public PlainSelect addMySqlSelectModifiers(MySqlSelectModifier... modifiers) { |
| 685 | + EnumSet<MySqlSelectModifier> copy = mySqlSelectModifiers.clone(); |
| 686 | + Collections.addAll(copy, modifiers); |
| 687 | + setMySqlSelectModifiers(copy); |
| 688 | + return this; |
| 689 | + } |
| 690 | + |
| 691 | + public PlainSelect withMySqlSelectModifiers(Collection<MySqlSelectModifier> modifiers) { |
| 692 | + setMySqlSelectModifiers(modifiers); |
| 693 | + return this; |
| 694 | + } |
| 695 | + |
| 696 | + private void setMySqlSelectModifier(MySqlSelectModifier modifier, boolean enabled) { |
| 697 | + if (enabled) { |
| 698 | + mySqlSelectModifiers.add(modifier); |
| 699 | + } else { |
| 700 | + mySqlSelectModifiers.remove(modifier); |
669 | 701 | } |
670 | 702 | } |
671 | 703 |
|
@@ -759,19 +791,28 @@ public PlainSelect withMySqlSqlNoCache(MySqlSqlCacheFlags mySqlCacheFlag) { |
759 | 791 | } |
760 | 792 |
|
761 | 793 | public boolean getMySqlSqlCalcFoundRows() { |
762 | | - return this.mySqlSqlCalcFoundRows; |
| 794 | + return mySqlSelectModifiers.contains(MySqlSelectModifier.SQL_CALC_FOUND_ROWS); |
763 | 795 | } |
764 | 796 |
|
765 | 797 | public void setMySqlSqlCalcFoundRows(boolean mySqlCalcFoundRows) { |
766 | | - this.mySqlSqlCalcFoundRows = mySqlCalcFoundRows; |
| 798 | + setMySqlSelectModifier(MySqlSelectModifier.SQL_CALC_FOUND_ROWS, mySqlCalcFoundRows); |
767 | 799 | } |
768 | 800 |
|
769 | 801 | public MySqlSqlCacheFlags getMySqlSqlCacheFlag() { |
770 | | - return this.mySqlCacheFlag; |
| 802 | + if (mySqlSelectModifiers.contains(MySqlSelectModifier.SQL_CACHE)) { |
| 803 | + return MySqlSqlCacheFlags.SQL_CACHE; |
| 804 | + } |
| 805 | + return mySqlSelectModifiers.contains(MySqlSelectModifier.SQL_NO_CACHE) |
| 806 | + ? MySqlSqlCacheFlags.SQL_NO_CACHE |
| 807 | + : null; |
771 | 808 | } |
772 | 809 |
|
773 | 810 | public void setMySqlSqlCacheFlag(MySqlSqlCacheFlags sqlCacheFlag) { |
774 | | - this.mySqlCacheFlag = sqlCacheFlag; |
| 811 | + mySqlSelectModifiers.remove(MySqlSelectModifier.SQL_CACHE); |
| 812 | + mySqlSelectModifiers.remove(MySqlSelectModifier.SQL_NO_CACHE); |
| 813 | + if (sqlCacheFlag != null) { |
| 814 | + mySqlSelectModifiers.add(MySqlSelectModifier.valueOf(sqlCacheFlag.name())); |
| 815 | + } |
775 | 816 | } |
776 | 817 |
|
777 | 818 | public PlainSelect withDistinct(Distinct distinct) { |
|
0 commit comments