├── .gitignore ├── LICENSE ├── README.md ├── pom.xml ├── redquerybuilder-core ├── pom.xml └── src │ ├── main │ ├── java │ │ ├── com │ │ │ └── redspr │ │ │ │ └── redquerybuilder │ │ │ │ └── core │ │ │ │ ├── RedQueryBuilderCore.gwt.xml │ │ │ │ ├── client │ │ │ │ ├── BaseSqlWidget.java │ │ │ │ ├── BaseVisitorContext.java │ │ │ │ ├── Configuration.java │ │ │ │ ├── From.java │ │ │ │ ├── HasMessages.java │ │ │ │ ├── Message.java │ │ │ │ ├── MyResources.java │ │ │ │ ├── RedQueryBuilder.java │ │ │ │ ├── ValueRegistry.java │ │ │ │ ├── Visitor.java │ │ │ │ ├── VisitorBase.java │ │ │ │ ├── VisitorContext.java │ │ │ │ ├── command │ │ │ │ │ ├── CommandBuilder.java │ │ │ │ │ ├── Function.java │ │ │ │ │ ├── IndexColumn.java │ │ │ │ │ ├── JavaAggregate.java │ │ │ │ │ ├── Message.java │ │ │ │ │ ├── NoOperation.java │ │ │ │ │ ├── Parser.java │ │ │ │ │ ├── Prepared.java │ │ │ │ │ ├── Sequence.java │ │ │ │ │ ├── dml │ │ │ │ │ │ ├── Query.java │ │ │ │ │ │ ├── Select.java │ │ │ │ │ │ ├── SelectUnion.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── conf │ │ │ │ │ ├── IdentifierEscaper.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── constant │ │ │ │ │ ├── ErrorCode.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── core.css │ │ │ │ ├── engine │ │ │ │ │ ├── ColumnResolver.java │ │ │ │ │ ├── Session.java │ │ │ │ │ ├── TableEvent.java │ │ │ │ │ ├── TableEventHandler.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── expression │ │ │ │ │ ├── Comparison.java │ │ │ │ │ ├── Condition.java │ │ │ │ │ ├── ConditionAndOr.java │ │ │ │ │ ├── ConditionAndOr.ui.xml │ │ │ │ │ ├── EditorWidgetFactory.java │ │ │ │ │ ├── Expression.java │ │ │ │ │ ├── ExpressionColumn.java │ │ │ │ │ ├── Nop.java │ │ │ │ │ ├── Null.java │ │ │ │ │ ├── Parameter.java │ │ │ │ │ ├── SelectEditorWidget.java │ │ │ │ │ ├── SuggestEditorWidget.java │ │ │ │ │ ├── ValueMultiListBox.java │ │ │ │ │ ├── Wildcard.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ ├── table │ │ │ │ │ ├── JoinHelper.java │ │ │ │ │ ├── TableFilter.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── util │ │ │ │ │ ├── CommandListBox.java │ │ │ │ │ ├── CommandWithLabel.java │ │ │ │ │ ├── JsStringArray.java │ │ │ │ │ ├── ListBox2.java │ │ │ │ │ ├── NumberBox.java │ │ │ │ │ ├── ObjectArray.java │ │ │ │ │ ├── StatementBuilder.java │ │ │ │ │ ├── StringUtils.java │ │ │ │ │ ├── XWidget.java │ │ │ │ │ └── package-info.java │ │ │ │ └── value │ │ │ │ │ ├── Value.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── config │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ └── shared │ │ │ │ └── meta │ │ │ │ ├── Cardinality.java │ │ │ │ ├── Column.java │ │ │ │ ├── Constraint.java │ │ │ │ ├── ConstraintReferential.java │ │ │ │ ├── Database.java │ │ │ │ ├── DbObject.java │ │ │ │ ├── DbObjectBase.java │ │ │ │ ├── Editor.java │ │ │ │ ├── EnumerateRequest.java │ │ │ │ ├── HasLabel.java │ │ │ │ ├── HasStyleName.java │ │ │ │ ├── HasValue2.java │ │ │ │ ├── Operator.java │ │ │ │ ├── Schema.java │ │ │ │ ├── SchemaObject.java │ │ │ │ ├── SchemaObjectBase.java │ │ │ │ ├── SuggestEditor.java │ │ │ │ ├── SuggestRequest.java │ │ │ │ ├── Table.java │ │ │ │ ├── Type.java │ │ │ │ └── package-info.java │ │ └── java │ │ │ ├── RedQueryBuilderCoreJre.gwt.xml │ │ │ ├── math │ │ │ ├── BigDecimal.java │ │ │ ├── BigInteger.java │ │ │ └── package-info.java │ │ │ └── sql │ │ │ ├── SQLException.java │ │ │ ├── Types.java │ │ │ └── package-info.java │ └── webapp │ │ └── WEB-INF │ │ └── web.xml │ └── test │ └── java │ └── com │ └── redspr │ └── redquerybuilder │ └── core │ └── client │ ├── AbstractTest.java │ ├── CapturingConfiguration.java │ ├── GwtTestBasics.java │ ├── GwtTestConf.java │ ├── GwtTestDom.java │ ├── GwtTestParsing.java │ └── expression │ ├── AbstractEditorTest.java │ ├── GwtTestDateEditor.java │ ├── GwtTestNumberEditor.java │ ├── GwtTestSuggestEditorWidget.java │ └── GwtTestTextEditor.java ├── redquerybuilder-dist ├── codeview │ ├── README.txt │ ├── allclasses.tmpl │ ├── allfiles.tmpl │ ├── class.tmpl │ ├── css │ │ ├── all.css │ │ ├── fonts │ │ │ ├── mplus-1m-bold-webfont.eot │ │ │ ├── mplus-1m-bold-webfont.svg │ │ │ ├── mplus-1m-bold-webfont.ttf │ │ │ ├── mplus-1m-bold-webfont.woff │ │ │ ├── mplus-1m-regular-webfont.eot │ │ │ ├── mplus-1m-regular-webfont.svg │ │ │ ├── mplus-1m-regular-webfont.ttf │ │ │ └── mplus-1m-regular-webfont.woff │ │ ├── handheld.css │ │ └── screen.css │ ├── javascript │ │ ├── all.js │ │ └── html5.js │ ├── license.txt │ ├── publish.js │ └── subtemplates │ │ ├── foot.tmpl │ │ ├── head.tmpl │ │ └── menu.tmpl ├── pom.xml └── src │ ├── changes │ └── changes.xml │ ├── main │ └── assembly │ │ └── src.xml │ └── site │ ├── fml │ └── general.fml │ ├── site.xml │ └── xhtml │ └── index.xhtml ├── redquerybuilder-jdbcsample ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── redspr │ │ └── redquerybuilder │ │ └── sample │ │ ├── MetaServlet.java │ │ ├── SearchServlet.java │ │ └── package-info.java │ ├── resources │ ├── meta.properties │ ├── simple1.sql │ └── world.sql │ └── webapp │ ├── WEB-INF │ ├── appengine-web.xml │ └── web.xml │ ├── flexigrid │ ├── css │ │ ├── flexigrid.css │ │ ├── flexigrid.pack.css │ │ └── images │ │ │ ├── bg.gif │ │ │ ├── btn-sprite.gif │ │ │ ├── ddn.png │ │ │ ├── dn.png │ │ │ ├── fhbg.gif │ │ │ ├── first.gif │ │ │ ├── hl.png │ │ │ ├── last.gif │ │ │ ├── line.gif │ │ │ ├── load.gif │ │ │ ├── load.png │ │ │ ├── magnifier.png │ │ │ ├── next.gif │ │ │ ├── prev.gif │ │ │ ├── up.png │ │ │ ├── uup.png │ │ │ └── wbg.gif │ └── js │ │ ├── flexigrid.js │ │ ├── flexigrid.pack.js │ │ └── jquery.min.js │ ├── index.html │ ├── jgrowl │ ├── jquery.jgrowl.css │ └── jquery.jgrowl.js │ ├── jsonjs │ └── json2.js │ └── static │ ├── busy.gif │ └── site.css ├── redquerybuilder-js ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── redspr │ │ │ └── redquerybuilder │ │ │ └── js │ │ │ ├── RedQueryBuilder.gwt.xml │ │ │ └── client │ │ │ ├── ConfigurationAdapter.java │ │ │ ├── JsCallback.java │ │ │ ├── JsColumn.java │ │ │ ├── JsConfiguration.java │ │ │ ├── JsDatabase.java │ │ │ ├── JsEditor.java │ │ │ ├── JsFk.java │ │ │ ├── JsList.java │ │ │ ├── JsMessage.java │ │ │ ├── JsOperator.java │ │ │ ├── JsSuggestion.java │ │ │ ├── JsTable.java │ │ │ ├── JsTableFilter.java │ │ │ ├── JsType.java │ │ │ ├── JsVisitor.java │ │ │ ├── RedQueryBuilder.java │ │ │ ├── conf │ │ │ ├── JsFrom.java │ │ │ └── package-info.java │ │ │ └── package-info.java │ ├── resources │ │ └── com │ │ │ └── google │ │ │ └── gwt │ │ │ └── user │ │ │ └── client │ │ │ └── TakesValue.java │ └── webapp │ │ ├── RedQueryBuilder │ │ ├── Configuration.nocache.js │ │ ├── RedQueryBuilderFactory.nocache.js │ │ └── gwt │ │ │ └── dark │ │ │ ├── dark.css │ │ │ ├── dark_rtl.css │ │ │ └── images │ │ │ ├── corner.png │ │ │ ├── corner_ie6.png │ │ │ ├── hborder.png │ │ │ ├── hborder_ie6.png │ │ │ ├── ie6 │ │ │ ├── corner_dialog_topleft.png │ │ │ ├── corner_dialog_topright.png │ │ │ ├── hborder_blue_shadow.png │ │ │ ├── hborder_gray_shadow.png │ │ │ ├── vborder_blue_shadow.png │ │ │ └── vborder_gray_shadow.png │ │ │ ├── splitPanelThumb.png │ │ │ ├── vborder.png │ │ │ └── vborder_ie6.png │ │ ├── WEB-INF │ │ └── web.xml │ │ ├── index.html │ │ ├── simple.js │ │ └── visitor.js │ └── test │ └── java │ └── com │ └── redspr │ └── redquerybuilder │ └── js │ └── client │ ├── AbstractTest.java │ ├── GwtTestBasics.java │ ├── GwtTestJsVisitor.java │ ├── MinimalDateMeta.json │ ├── Resources.java │ ├── SampleConfig1.js │ └── VisitorJs.java └── redquerybuilder-parent ├── NOTES.txt ├── conf └── checkstyle.xml └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.jar 5 | *.war 6 | 7 | # gwt caches and compiled units # 8 | war/gwt_bree/ 9 | gwt-unitCache/ 10 | 11 | # boilerplate generated classes # 12 | .apt_generated/ 13 | 14 | # more caches and things from deploy # 15 | war/ 16 | www-test/ 17 | 18 | target/ 19 | 20 | .project 21 | .classpath 22 | .settings/ 23 | .checkstyle 24 | 25 | 26 | Thumbs.db 27 | 28 | .gwt/ 29 | 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | RedQueryBuilder 2 | =============== 3 | 4 | An interative demo and ZIP download are hosted on GAE here http://redquerybuilder.appspot.com/ 5 | 6 | RedQueryBuilder uses an adapted parser from http://www.h2database.com/html/main.html and shares the parse object tree. 7 | 8 | 9 | Build 10 | ----- 11 | 12 | * Install Maven http://maven.apache.org/run-maven/index.html 13 | * mvn clean install 14 | * The JavaScript friendly files will be in js/target/js-{version} 15 | 16 | Eclipse JUnit 17 | ------------- 18 | Known to be good: Eclipse 4.4.2, Google plugin 3.8.0, GWT 2.7.0 19 | 20 | JSInterop tests need: 21 | -Dgwt.args="-XjsInteropMode JS -nodevMode" 22 | 23 | 24 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | root 5 | pom 6 | 7 | 8 | com.redspr 9 | redquerybuilder-parent 10 | 0.8.0 11 | redquerybuilder-parent/pom.xml 12 | 13 | 14 | 15 | redquerybuilder-parent 16 | redquerybuilder-jdbcsample 17 | redquerybuilder-core 18 | redquerybuilder-js 19 | redquerybuilder-dist 20 | 21 | 22 | 23 | 24 | 25 | org.apache.maven.plugins 26 | maven-release-plugin 27 | 2.3.2 28 | 29 | true 30 | false 31 | true 32 | v@{project.version} 33 | site deploy 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /redquerybuilder-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | com.redspr 5 | redquerybuilder-parent 6 | 0.8.0 7 | ../redquerybuilder-parent/pom.xml 8 | 9 | redquerybuilder-core 10 | 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-source-plugin 16 | 2.1.2 17 | 18 | 19 | attach-sources 20 | 21 | jar 22 | 23 | 24 | 25 | 26 | 27 | 28 | org.codehaus.mojo 29 | gwt-maven-plugin 30 | 31 | 32 | 33 | com.redspr.redquerybuilder.core.RedQueryBuilderCore 34 | htmlunit 35 | 120 36 | 37 | 38 | compile 39 | test 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | org.apache.maven.plugins 48 | maven-war-plugin 49 | 2.0.2 50 | 51 | **/*.class 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | src/main/java 61 | 62 | **/client/** 63 | **/public/** 64 | **/shared/** 65 | java/** 66 | **/*.gwt.xml 67 | **/*.gif 68 | **/*.png 69 | **/*.css 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | com.google.gwt 78 | gwt-user 79 | provided 80 | 81 | 82 | junit 83 | junit 84 | 85 | 86 | com.google.gwt 87 | gwt-dev 88 | provided 89 | 90 | 91 | 92 | 93 | 94 | quick 95 | 96 | true 97 | true 98 | 1 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/RedQueryBuilderCore.gwt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/BaseSqlWidget.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | 4 | import com.google.gwt.user.client.ui.Composite; 5 | import com.google.gwt.user.client.ui.Widget; 6 | import com.redspr.redquerybuilder.core.client.engine.Session; 7 | import com.redspr.redquerybuilder.core.client.expression.Expression; 8 | 9 | /** 10 | * 11 | * Lifecycle: 1) Parser creates nodes in any order, names rather than refs 2) 12 | * dirty - 13 | * 14 | * @author sam 15 | */ 16 | // XXX kill the event bus? 17 | public class BaseSqlWidget extends Composite { 18 | 19 | 20 | { 21 | MyResources.INSTANCE.css().ensureInjected(); 22 | } 23 | 24 | private final Session session; 25 | 26 | protected BaseSqlWidget(Session session2) { 27 | this.session = session2; 28 | } 29 | 30 | public BaseSqlWidget remove(Expression e) { 31 | throw new IllegalArgumentException(); 32 | } 33 | 34 | public void replace(Expression old, Expression x) { 35 | } 36 | 37 | public final BaseSqlWidget getParentExpression() { 38 | Widget w = getParent(); 39 | while (w != null) { 40 | if (w instanceof BaseSqlWidget) { 41 | break; 42 | } 43 | w = w.getParent(); 44 | } 45 | return (BaseSqlWidget) w; 46 | } 47 | 48 | public void onDirty() { 49 | } 50 | 51 | public void fireDirty() { 52 | getSession().getCommandBuilder().fireDirty(); 53 | } 54 | 55 | public final void traverse(Visitor callback) { 56 | VisitorContext context = new BaseVisitorContext(this); 57 | callback.visit(context); 58 | acceptChildren(callback); 59 | callback.handle(this); 60 | callback.endVisit(context); 61 | } 62 | 63 | protected void acceptChildren(Visitor callback) { 64 | 65 | } 66 | 67 | public int hook() { 68 | return this.getAbsoluteTop() + this.getOffsetHeight() / 2; 69 | } 70 | 71 | protected Session getSession() { 72 | return session; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/BaseVisitorContext.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import com.google.gwt.user.client.ui.HasValue; 4 | import com.google.gwt.user.client.ui.Widget; 5 | import com.redspr.redquerybuilder.core.client.command.dml.Select; 6 | import com.redspr.redquerybuilder.core.client.expression.Comparison; 7 | import com.redspr.redquerybuilder.core.client.expression.ConditionAndOr; 8 | import com.redspr.redquerybuilder.core.client.expression.ExpressionColumn; 9 | import com.redspr.redquerybuilder.core.client.expression.Parameter; 10 | 11 | 12 | public class BaseVisitorContext implements VisitorContext { 13 | 14 | private HasValue hv; 15 | 16 | private HasMessages hm; 17 | 18 | private String nodeType; 19 | 20 | private String nodeValue; 21 | 22 | public BaseVisitorContext(BaseSqlWidget baseSqlWidget) { 23 | if (baseSqlWidget instanceof Parameter) { 24 | Widget w = ((Parameter) baseSqlWidget).getEditorWidget(); 25 | 26 | if (w instanceof HasValue) { 27 | hv = (HasValue) w; 28 | } 29 | nodeType = NodeType.PARAMETER; 30 | nodeValue = "?"; 31 | } else if (baseSqlWidget instanceof Comparison) { 32 | nodeType = NodeType.COMPARISON; 33 | nodeValue = ((Comparison) baseSqlWidget).getOperatorName(); 34 | } else if (baseSqlWidget instanceof ConditionAndOr) { 35 | nodeType = NodeType.LOGIC; 36 | nodeValue = ((ConditionAndOr) baseSqlWidget).getString(); 37 | } else if (baseSqlWidget instanceof ExpressionColumn) { 38 | ExpressionColumn ec = (ExpressionColumn) baseSqlWidget; 39 | nodeType = NodeType.COLUMN; 40 | nodeValue = ec.getQualifiedColumnName(); 41 | } else if (baseSqlWidget instanceof Select){ 42 | Select select = (Select) baseSqlWidget; 43 | nodeType = NodeType.SELECT; 44 | nodeValue = "WIP"; 45 | } else { 46 | throw new RuntimeException("What is " + baseSqlWidget.getClass()); 47 | } 48 | if (baseSqlWidget instanceof HasMessages) { 49 | hm = (HasMessages) baseSqlWidget; 50 | } 51 | } 52 | 53 | @Override 54 | public String getNodeType() { 55 | return nodeType; 56 | } 57 | 58 | @Override 59 | public String getNodeName() { 60 | return nodeValue; 61 | } 62 | 63 | @Override 64 | public HasMessages asHasMessages() { 65 | return hm; 66 | } 67 | 68 | @Override 69 | public HasValue asHasValue() { 70 | return hv; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/Configuration.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import java.util.List; 4 | 5 | import com.google.gwt.user.client.rpc.AsyncCallback; 6 | import com.google.gwt.user.client.ui.SuggestOracle.Response; 7 | import com.redspr.redquerybuilder.core.client.table.TableFilter; 8 | import com.redspr.redquerybuilder.core.client.util.ObjectArray; 9 | import com.redspr.redquerybuilder.core.shared.meta.Database; 10 | import com.redspr.redquerybuilder.core.shared.meta.EnumerateRequest; 11 | import com.redspr.redquerybuilder.core.shared.meta.SuggestRequest; 12 | 13 | /** 14 | * Extend this class to integrate with RedQueryBuilder. 15 | */ 16 | public class Configuration { 17 | private Database database = new Database(); 18 | 19 | private final From from = new From(); 20 | 21 | public void fireEnumerate(EnumerateRequest request, AsyncCallback callback) { 22 | } 23 | 24 | // XXX not called by CommandBuilder. GWT users meant to use RedQueryBuilder? 25 | public void fireOnSqlChange(String sql, List args) { 26 | } 27 | 28 | public void fireOnTableChange(ObjectArray filters) { 29 | } 30 | 31 | public void fireDefaultSuggest(SuggestRequest request, AsyncCallback callback) { 32 | } 33 | 34 | public void fireSuggest(SuggestRequest request, AsyncCallback callback) { 35 | } 36 | 37 | public Database getDatabase() { 38 | return database; 39 | } 40 | 41 | public void setDatabase(Database p) { 42 | this.database = p; 43 | } 44 | 45 | public From getFrom() { 46 | return from; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/From.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | /** 4 | * 5 | * Configure From control. 6 | * 7 | */ 8 | public class From { 9 | private boolean visible = true; 10 | 11 | 12 | 13 | public boolean isVisible() { 14 | return visible; 15 | } 16 | 17 | public void setVisible(boolean p) { 18 | this.visible = p; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/HasMessages.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import com.google.gwt.core.client.js.JsType; 4 | 5 | /** 6 | * 7 | * EXPERIMENTAL - likely to change 8 | */ 9 | @JsType 10 | public interface HasMessages { 11 | 12 | void showMessage(Message message); 13 | 14 | // void showMessages(List messages); 15 | } 16 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/Message.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import com.google.gwt.core.client.js.JsType; 4 | 5 | @JsType 6 | public interface Message { 7 | 8 | 9 | String getText(); 10 | } 11 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/MyResources.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import com.google.gwt.core.client.GWT; 4 | import com.google.gwt.resources.client.ClientBundle; 5 | import com.google.gwt.resources.client.CssResource; 6 | 7 | public interface MyResources extends ClientBundle { 8 | MyResources INSTANCE = GWT.create(MyResources.class); 9 | 10 | @Source("core.css") 11 | CssResource css(); 12 | } 13 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/RedQueryBuilder.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2010-2013 Redspr Ltd. 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the Eclipse Public License v1.0 5 | * which accompanies this distribution, and is available at 6 | * http://www.eclipse.org/legal/epl-v10.html 7 | * 8 | * Contributors: 9 | * Sam Hough - initial API and implementation 10 | *******************************************************************************/ 11 | package com.redspr.redquerybuilder.core.client; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | import com.google.gwt.core.client.EntryPoint; 17 | import com.google.gwt.event.logical.shared.ValueChangeEvent; 18 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 19 | import com.google.gwt.user.client.ui.SimplePanel; 20 | import com.redspr.redquerybuilder.core.client.command.CommandBuilder; 21 | import com.redspr.redquerybuilder.core.client.command.dml.Select; 22 | import com.redspr.redquerybuilder.core.client.engine.Session; 23 | import com.redspr.redquerybuilder.core.client.engine.TableEvent; 24 | import com.redspr.redquerybuilder.core.client.engine.TableEventHandler; 25 | import com.redspr.redquerybuilder.core.client.expression.ExpressionColumn; 26 | import com.redspr.redquerybuilder.core.client.table.TableFilter; 27 | import com.redspr.redquerybuilder.core.client.util.ObjectArray; 28 | import com.redspr.redquerybuilder.core.shared.meta.Column; 29 | 30 | public class RedQueryBuilder implements EntryPoint { 31 | 32 | private void createCommandBuilder(final Configuration config, String sql, List args) 33 | throws Exception { 34 | 35 | final Session session = new Session(config); 36 | 37 | final CommandBuilder builder = new CommandBuilder(session, sql, args); 38 | 39 | session.getMsgBus().addHandler(TableEvent.TYPE, 40 | new TableEventHandler() { 41 | @Override 42 | public void onTable(TableEvent e) { 43 | if (session.getFilters().size() > 0) { 44 | config.fireOnTableChange(session.getFilters()); 45 | // XXX need to do distinct? 46 | ObjectArray expr = ObjectArray.newInstance(); 47 | TableFilter tf = session.getFilters().get(0); 48 | String alias = tf.getAlias(); 49 | for (Column col : tf.getTable().getColumns()) { 50 | expr.add(new ExpressionColumn(session, null, alias, 51 | col.getName())); 52 | } 53 | builder.getSelect().setExpressions(expr); 54 | } else { 55 | builder.getSelect().setExpressions(null); 56 | } 57 | } 58 | }); 59 | 60 | builder.addValueChangeHandler(new ValueChangeHandler event) { 63 | List args = new ArrayList(); 64 | String sql = event.getValue().getSQL(args); 65 | 66 | config.fireOnSqlChange(sql, args); 67 | } 68 | }); 69 | 70 | builderContainer.setWidget(builder); 71 | 72 | config.fireOnTableChange(session.getFilters()); 73 | } 74 | 75 | private final SimplePanel builderContainer = new SimplePanel(); 76 | 77 | @Override 78 | public void onModuleLoad() { 79 | 80 | //publish(); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/ValueRegistry.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2010-2013 Redspr Ltd. 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the Eclipse Public License v1.0 5 | * which accompanies this distribution, and is available at 6 | * http://www.eclipse.org/legal/epl-v10.html 7 | * 8 | * Contributors: 9 | * Sam Hough - initial API and implementation 10 | *******************************************************************************/ 11 | package com.redspr.redquerybuilder.core.client; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class ValueRegistry { 17 | public class Y { 18 | private Object value; 19 | 20 | public int getIndex() { 21 | return vals.indexOf(this); 22 | } 23 | 24 | public void setValue(Object p) { 25 | value = p; 26 | } 27 | 28 | public Object getValue() { 29 | return value; 30 | } 31 | } 32 | 33 | public void add(Y x) { 34 | if (!vals.contains(x)) { 35 | vals.add(x); 36 | } 37 | } 38 | 39 | public void remove(Y x) { 40 | vals.remove(x); 41 | } 42 | 43 | private final List vals = new ArrayList(); 44 | 45 | public void add(Object a) { 46 | Y y = new Y(); 47 | y.setValue(a); 48 | vals.add(y); 49 | } 50 | 51 | public Y getY(int i) { 52 | while (vals.size() <= i) { 53 | vals.add(new Y()); 54 | } 55 | return vals.get(i); 56 | } 57 | 58 | public Y getY() { 59 | Y x = new Y(); 60 | vals.add(x); 61 | return x; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/Visitor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import com.google.gwt.core.client.js.impl.PrototypeOfJsType; 4 | 5 | /** 6 | * 7 | * EXPERIMENTAL - likely to change 8 | */ 9 | @com.google.gwt.core.client.js.JsType(prototype = "$wnd.RqbVisitor") 10 | public interface Visitor { 11 | 12 | @PrototypeOfJsType 13 | static class Prototype implements Visitor { 14 | 15 | @Override 16 | public void handle(BaseSqlWidget w) { 17 | } 18 | 19 | @Override 20 | public void visit(VisitorContext context) { 21 | } 22 | 23 | @Override 24 | public void endVisit(VisitorContext context) { 25 | } 26 | 27 | } 28 | 29 | @Deprecated 30 | void handle(BaseSqlWidget w); 31 | 32 | void visit(VisitorContext context); 33 | 34 | void endVisit(VisitorContext context); 35 | } 36 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/VisitorBase.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | public class VisitorBase implements Visitor { 4 | 5 | @Override 6 | public void handle(BaseSqlWidget w) { 7 | } 8 | 9 | @Override 10 | public void visit(VisitorContext context) { 11 | } 12 | 13 | @Override 14 | public void endVisit(VisitorContext context) { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/VisitorContext.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import com.google.gwt.core.client.js.JsType; 4 | import com.google.gwt.user.client.ui.HasValue; 5 | 6 | /** 7 | * 8 | * EXPERIMENTAL - likely to change 9 | * 10 | * @param 11 | */ 12 | @JsType 13 | public interface VisitorContext { 14 | interface NodeType { 15 | String PARAMETER = "PARAMETER"; 16 | String COLUMN = "COLUMN"; 17 | String COMPARISON = "COMPARISON"; 18 | String LOGIC = "LOGIC"; // XXX not sure about this 19 | String SELECT = "SELECT"; 20 | }; 21 | 22 | String getNodeType(); // TODO __ enum and JS? 23 | String getNodeName(); 24 | 25 | HasMessages asHasMessages(); 26 | 27 | HasValue asHasValue(); 28 | } 29 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/CommandBuilder.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command; 2 | 3 | import java.sql.SQLException; 4 | import java.util.List; 5 | 6 | import com.google.gwt.core.client.js.JsType; 7 | import com.google.gwt.event.logical.shared.HasValueChangeHandlers; 8 | import com.google.gwt.event.logical.shared.ValueChangeEvent; 9 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 10 | import com.google.gwt.event.shared.HandlerRegistration; 11 | import com.google.gwt.user.client.ui.SimplePanel; 12 | import com.redspr.redquerybuilder.core.client.BaseSqlWidget; 13 | import com.redspr.redquerybuilder.core.client.Visitor; 14 | import com.redspr.redquerybuilder.core.client.VisitorBase; 15 | import com.redspr.redquerybuilder.core.client.command.dml.Select; 16 | import com.redspr.redquerybuilder.core.client.engine.Session; 17 | 18 | /** 19 | * Container for the command - currently only ever SELECT 20 | */ 21 | @JsType 22 | public class CommandBuilder extends SimplePanel implements 23 | HasValueChangeHandlers handler) { 71 | return addHandler(handler, ValueChangeEvent.getType()); 72 | } 73 | 74 | public void accept(Visitor visitor) { 75 | select.traverse(visitor); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/Function.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command; 2 | 3 | public class Function { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/IndexColumn.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command; 2 | 3 | public class IndexColumn { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/JavaAggregate.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command; 2 | 3 | public class JavaAggregate { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/Message.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License, 3 | * Version 1.0, and under the Eclipse Public License, Version 1.0 4 | * (http://h2database.com/html/license.html). 5 | * Initial Developer: H2 Group 6 | * 7 | * Nicolas Fortin, Atelier SIG, IRSTV FR CNRS 24888 8 | * Support for the operator "&&" as an alias for SPATIAL_INTERSECTS 9 | */ 10 | package com.redspr.redquerybuilder.core.client.command; 11 | 12 | import java.sql.SQLException; 13 | 14 | public final class Message { 15 | 16 | private Message() { 17 | } 18 | 19 | public static SQLException addSQL(Exception e, String sql) { 20 | return new SQLException(sql, e); 21 | } 22 | 23 | public static SQLException getSyntaxError(String sqlCommand, int parseIndex) { 24 | return new SQLException("In " + sqlCommand + " at " + parseIndex + " wanted "); 25 | } 26 | 27 | public static SQLException getSyntaxError(String sqlCommand, int parseIndex, String expected) { 28 | return new SQLException("In " + sqlCommand + " at " + parseIndex + " wanted " + expected); 29 | } 30 | 31 | public static SQLException getSQLException(int code, Exception e, String expected) { 32 | return new SQLException("In " + code + " at " + e + " wanted " + expected, e); 33 | } 34 | 35 | public static SQLException getSQLException(int code) { 36 | return new SQLException("In " + code); 37 | } 38 | public static SQLException getSQLException(int code, String... msg) { 39 | return new SQLException("In " + code); 40 | } 41 | 42 | public static RuntimeException throwInternalError(String msg) { 43 | return new RuntimeException(msg); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/NoOperation.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command; 2 | 3 | 4 | public class NoOperation extends Prepared { 5 | NoOperation() { 6 | super(null); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/Prepared.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command; 2 | 3 | 4 | import com.redspr.redquerybuilder.core.client.BaseSqlWidget; 5 | import com.redspr.redquerybuilder.core.client.engine.Session; 6 | 7 | public class Prepared extends BaseSqlWidget { 8 | 9 | public Prepared(Session session) { 10 | super(session); 11 | //initWidget(new Label("Class=" + getClass().getName())); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/Sequence.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command; 2 | 3 | public class Sequence { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/dml/Query.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.command.dml; 2 | 3 | 4 | import com.redspr.redquerybuilder.core.client.command.Prepared; 5 | import com.redspr.redquerybuilder.core.client.engine.Session; 6 | 7 | public class Query extends Prepared { 8 | public Query(Session session) { 9 | super(session); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/dml/SelectUnion.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License, 3 | * Version 1.0, and under the Eclipse Public License, Version 1.0 4 | * (http://h2database.com/html/license.html). 5 | * Initial Developer: H2 Group 6 | * 7 | * Nicolas Fortin, Atelier SIG, IRSTV FR CNRS 24888 8 | * Support for the operator "&&" as an alias for SPATIAL_INTERSECTS 9 | */ 10 | package com.redspr.redquerybuilder.core.client.command.dml; 11 | 12 | import com.redspr.redquerybuilder.core.client.engine.Session; 13 | import com.redspr.redquerybuilder.core.client.expression.Expression; 14 | import com.redspr.redquerybuilder.core.client.util.ObjectArray; 15 | 16 | 17 | /** 18 | * Represents a union SELECT statement. 19 | */ 20 | public class SelectUnion extends Query { 21 | 22 | /** 23 | * The type of a UNION statement. 24 | */ 25 | public static final int UNION = 0; 26 | 27 | /** 28 | * The type of a UNION ALL statement. 29 | */ 30 | public static final int UNION_ALL = 1; 31 | 32 | /** 33 | * The type of an EXCEPT statement. 34 | */ 35 | public static final int EXCEPT = 2; 36 | 37 | /** 38 | * The type of an INTERSECT statement. 39 | */ 40 | public static final int INTERSECT = 3; 41 | 42 | private int unionType; 43 | private final Query left; 44 | 45 | private Query right; 46 | private ObjectArray expressions; 47 | // private ObjectArray orderList; 48 | // SortOrder sort; 49 | private boolean distinct; 50 | private boolean isPrepared, checkInit; 51 | private boolean isForUpdate; 52 | 53 | public SelectUnion(Session session, Query query) { 54 | super(session); 55 | this.left = query; 56 | } 57 | 58 | public void setUnionType(int type) { 59 | this.unionType = type; 60 | } 61 | 62 | public void setRight(Query select) { 63 | right = select; 64 | } 65 | 66 | 67 | // public void setOrder(ObjectArray order) { 68 | // orderList = order; 69 | // } 70 | 71 | // private Value[] convert(Value[] values, int columnCount) throws SQLException { 72 | // for (int i = 0; i < columnCount; i++) { 73 | // Expression e = expressions.get(i); 74 | // // values[i] = values[i].convertTo(e.getType()); 75 | // } 76 | // return values; 77 | // } 78 | 79 | 80 | 81 | 82 | // public HashSet getTables() { 83 | // HashSet
set = left.getTables(); 84 | // set.addAll(right.getTables()); 85 | // return set; 86 | // } 87 | 88 | public void setDistinct(boolean b) { 89 | distinct = b; 90 | } 91 | 92 | public ObjectArray getExpressions() { 93 | return expressions; 94 | } 95 | 96 | // public void mapColumns(ColumnResolver resolver, int level) throws SQLException { 97 | // left.mapColumns(resolver, level); 98 | // right.mapColumns(resolver, level); 99 | // } 100 | // 101 | // public void setEvaluatable(TableFilter tableFilter, boolean b) { 102 | // left.setEvaluatable(tableFilter, b); 103 | // right.setEvaluatable(tableFilter, b); 104 | // } 105 | 106 | // public void addGlobalCondition(Parameter param, int columnId, int comparisonType) throws SQLException { 107 | // addParameter(param); 108 | // switch (unionType) { 109 | // case UNION_ALL: 110 | // case UNION: 111 | // case INTERSECT: { 112 | // left.addGlobalCondition(param, columnId, comparisonType); 113 | // right.addGlobalCondition(param, columnId, comparisonType); 114 | // break; 115 | // } 116 | // case EXCEPT: { 117 | // left.addGlobalCondition(param, columnId, comparisonType); 118 | // break; 119 | // } 120 | // default: 121 | // Message.throwInternalError("type=" + unionType); 122 | // } 123 | // } 124 | 125 | // public String getPlanSQL() { 126 | // StringBuilder buff = new StringBuilder(); 127 | // buff.append('(').append(StringUtils.unEnclose(left.getPlanSQL())).append(')'); 128 | // switch (unionType) { 129 | // case UNION_ALL: 130 | // buff.append("UNION ALL "); 131 | // break; 132 | // case UNION: 133 | // buff.append("UNION "); 134 | // break; 135 | // case INTERSECT: 136 | // buff.append("INTERSECT "); 137 | // break; 138 | // case EXCEPT: 139 | // buff.append("EXCEPT "); 140 | // break; 141 | // default: 142 | // Message.throwInternalError("type=" + unionType); 143 | // } 144 | // buff.append('(').append(StringUtils.unEnclose(right.getPlanSQL())).append(')'); 145 | // Expression[] exprList = expressions.toArray(new Expression[expressions.size()]); 146 | // if (sort != null) { 147 | // buff.append(" ORDER BY ").append(sort.getSQL(exprList, exprList.length)); 148 | // } 149 | // if (limitExpr != null) { 150 | // buff.append(" LIMIT ").append(StringUtils.unEnclose(limitExpr.getSQL())); 151 | // if (offsetExpr != null) { 152 | // buff.append(" OFFSET ").append(StringUtils.unEnclose(offsetExpr.getSQL())); 153 | // } 154 | // } 155 | // if (isForUpdate) { 156 | // buff.append(" FOR UPDATE"); 157 | // } 158 | // return buff.toString(); 159 | // } 160 | 161 | 162 | 163 | 164 | public String getFirstColumnAlias(Session s) { 165 | return null; 166 | } 167 | 168 | } 169 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/dml/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.command.dml; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/command/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.command; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/conf/IdentifierEscaper.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.conf; 2 | 3 | public interface IdentifierEscaper { 4 | String quote(String id); 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/conf/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.conf; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/constant/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.constant; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/core.css: -------------------------------------------------------------------------------- 1 | @external rqb*; 2 | 3 | .rqbAndOrOpContainer { 4 | position:relative; 5 | width:4.8em; 6 | } 7 | 8 | .rqbAndOrOpUpper { 9 | border-style:solid; 10 | border-color:#bbb; 11 | border-width:10px 0 10px 10px; 12 | border-radius: 20px 0 0 20px; 13 | width:1em; 14 | position:absolute; 15 | z-index:-1; 16 | margin-left:3.8em; 17 | } 18 | 19 | .rqbAndOrOp { 20 | position:absolute; 21 | background-color:#888; 22 | border-style:solid; 23 | border-color:#888; 24 | border-width:5px; 25 | border-radius:10px; 26 | } 27 | 28 | 29 | .rqbComparison { 30 | background-color:#888; 31 | border-style:solid; 32 | border-color:#888; 33 | border-width:5px; 34 | border-radius:10px; 35 | } 36 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/engine/ColumnResolver.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.engine; 2 | 3 | import com.redspr.redquerybuilder.core.shared.meta.Column; 4 | 5 | public interface ColumnResolver { 6 | Column resolveColumn(String alias, String columnName); 7 | } 8 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/engine/Session.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.engine; 2 | 3 | 4 | import com.google.gwt.event.shared.HandlerManager; 5 | import com.redspr.redquerybuilder.core.client.Configuration; 6 | import com.redspr.redquerybuilder.core.client.ValueRegistry; 7 | import com.redspr.redquerybuilder.core.client.command.CommandBuilder; 8 | import com.redspr.redquerybuilder.core.client.command.dml.Select; 9 | import com.redspr.redquerybuilder.core.client.conf.IdentifierEscaper; 10 | import com.redspr.redquerybuilder.core.client.table.TableFilter; 11 | import com.redspr.redquerybuilder.core.client.util.ObjectArray; 12 | import com.redspr.redquerybuilder.core.shared.meta.Column; 13 | import com.redspr.redquerybuilder.core.shared.meta.Database; 14 | import com.redspr.redquerybuilder.core.shared.meta.Table; 15 | 16 | /** 17 | * Communication bus for entire system. 18 | * 19 | * All nodes in the tree hold a reference to its Session. 20 | */ 21 | public class Session { 22 | 23 | private static IdentifierEscaper identifierEscaper = new IdentifierEscaper() { 24 | @Override 25 | public String quote(String id) { 26 | return "\"" + id + "\""; 27 | } 28 | }; 29 | 30 | public void setIdentifierEscaper(IdentifierEscaper p) { 31 | identifierEscaper = p; 32 | } 33 | 34 | /** 35 | * Add double quotes around an identifier if required. 36 | * 37 | * @param s the identifier 38 | * @return the quoted identifier 39 | */ 40 | public static String quoteIdentifier(String s) { 41 | return identifierEscaper.quote(s); 42 | } 43 | 44 | // XXX need commandBuilder and select? 45 | private CommandBuilder commandBuilder; 46 | 47 | private Select select; 48 | 49 | private Configuration config; 50 | 51 | private final ValueRegistry valueRegistry = new ValueRegistry(); 52 | 53 | private final Database database; 54 | 55 | private final HandlerManager msgbus; 56 | 57 | 58 | // XXX 00 remove one of these constructors 59 | public Session(Configuration config2) { 60 | this(config2.getDatabase()); 61 | this.config = config2; 62 | } 63 | 64 | @Deprecated 65 | public Session(Database database2) { 66 | database = database2; 67 | msgbus = new HandlerManager(this); 68 | } 69 | 70 | public Configuration getConfig() { 71 | return config; 72 | } 73 | 74 | public CommandBuilder getCommandBuilder() { 75 | return commandBuilder; 76 | } 77 | 78 | public void setCommandBuilder(CommandBuilder p) { 79 | commandBuilder = p; 80 | } 81 | 82 | public Database getDatabase() { 83 | return database; 84 | } 85 | 86 | 87 | public HandlerManager getMsgBus() { 88 | return msgbus; 89 | } 90 | 91 | 92 | 93 | public void setSelect(Select p) { 94 | select = p; 95 | } 96 | 97 | public Column resolveColumn(String alias, String columnName) { 98 | return select.resolveColumn(alias, columnName); 99 | } 100 | 101 | public ObjectArray getFilters() { 102 | return select.getFilters(); 103 | } 104 | 105 | public TableFilter getTableFilter(Table t) { 106 | for (TableFilter tf : select.getFilters()) { 107 | if (tf.getTable().equals(t)) { 108 | return tf; 109 | } 110 | } 111 | return null; 112 | } 113 | 114 | public TableFilter createTableFilter(Table t) { 115 | TableFilter tf = new TableFilter(this, t, TableFilter.newAlias(), select); 116 | select.addTableFilter(tf, true); // XXX really is true? 117 | return tf; 118 | } 119 | 120 | public TableFilter getOrCreateTableFilter(Table t) { 121 | TableFilter tf = getTableFilter(t); 122 | if (tf == null) { 123 | tf = createTableFilter(t); 124 | } 125 | return tf; 126 | } 127 | 128 | //public Table getTable(String alias) { 129 | // return select.getTable(alias); 130 | //} 131 | 132 | public Table getRootTable() { 133 | // XXX maybe if no table then grab default? 134 | // or should select always have one table? 135 | // or ui shouldn't offer condition button till table? 136 | return select.getFilters().get(0).getTable(); 137 | } 138 | 139 | public ValueRegistry getValueRegistry() { 140 | return valueRegistry; 141 | } 142 | } 143 | 144 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/engine/TableEvent.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.engine; 2 | 3 | import com.google.gwt.event.shared.GwtEvent; 4 | 5 | public class TableEvent extends GwtEvent { 6 | public static final Type TYPE = new Type(); 7 | 8 | // XXX only for root table changing? 9 | public TableEvent() { 10 | } 11 | 12 | @Override 13 | public Type getAssociatedType() { 14 | return TYPE; 15 | } 16 | 17 | @Override 18 | protected void dispatch(TableEventHandler handler) { 19 | handler.onTable(this); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/engine/TableEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.engine; 2 | 3 | import com.google.gwt.event.shared.EventHandler; 4 | 5 | public interface TableEventHandler extends EventHandler { 6 | void onTable(TableEvent e); 7 | } 8 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/engine/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.engine; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/Condition.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import com.redspr.redquerybuilder.core.client.engine.Session; 4 | 5 | 6 | 7 | /** 8 | * Represents a condition returning a boolean value, or NULL. 9 | */ 10 | public abstract class Condition extends Expression { 11 | 12 | protected Condition(Session session) { 13 | super(session); 14 | } 15 | 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/ConditionAndOr.ui.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | 7 | 15 | 16 | 17 | 18 | 19 | 20 |
8 |
9 |
10 |
11 | 12 |
13 |
14 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/EditorWidgetFactory.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2010-2013 Redspr Ltd. 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the Eclipse Public License v1.0 5 | * which accompanies this distribution, and is available at 6 | * http://www.eclipse.org/legal/epl-v10.html 7 | * 8 | * Contributors: 9 | * Sam Hough - initial API and implementation 10 | *******************************************************************************/ 11 | package com.redspr.redquerybuilder.core.client.expression; 12 | 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | 16 | import com.google.gwt.i18n.client.DateTimeFormat; 17 | import com.google.gwt.user.client.ui.TextBox; 18 | import com.google.gwt.user.client.ui.Widget; 19 | import com.google.gwt.user.datepicker.client.DateBox; 20 | import com.redspr.redquerybuilder.core.client.engine.Session; 21 | import com.redspr.redquerybuilder.core.client.util.NumberBox; 22 | import com.redspr.redquerybuilder.core.shared.meta.Cardinality; 23 | import com.redspr.redquerybuilder.core.shared.meta.Column; 24 | import com.redspr.redquerybuilder.core.shared.meta.Editor; 25 | import com.redspr.redquerybuilder.core.shared.meta.Editor.DateEditor; 26 | import com.redspr.redquerybuilder.core.shared.meta.Editor.SelectEditor; 27 | import com.redspr.redquerybuilder.core.shared.meta.Operator; 28 | import com.redspr.redquerybuilder.core.shared.meta.SuggestEditor; 29 | 30 | // register cardinality and editor... 31 | public class EditorWidgetFactory { 32 | 33 | private static final Map KEY_TO_FACTORY = 34 | new HashMap(); 35 | 36 | interface Factory { 37 | Widget create(Session session, Column column); 38 | } 39 | 40 | private static void add(Class editorClass, Cardinality card, Factory factory) { 41 | Object key = editorClass.getName() + "_" + card.name(); 42 | KEY_TO_FACTORY.put(key, factory); 43 | } 44 | 45 | static { 46 | add(Editor.TextEditor.class, Cardinality.ONE, new Factory() { 47 | @Override 48 | public Widget create(Session session, Column column) { 49 | return new TextBox(); 50 | } 51 | }); 52 | 53 | add(SuggestEditor.class, Cardinality.ONE, new Factory() { 54 | @Override 55 | public Widget create(Session session, Column column) { 56 | return new SuggestEditorWidget(session, column); 57 | } 58 | }); 59 | 60 | add(Editor.DateEditor.class, Cardinality.ONE, new Factory() { 61 | @Override 62 | public Widget create(Session session, Column column) { 63 | DateBox dateBox = new DateBox(); 64 | 65 | String pattern = (String) column.getEditor().getAttribute(DateEditor.FORMAT); 66 | if (pattern != null) { 67 | dateBox.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat(pattern))); 68 | } 69 | return dateBox; 70 | } 71 | }); 72 | 73 | add(Editor.NumberEditor.class, Cardinality.ONE, new Factory() { 74 | @Override 75 | public Widget create(Session session, Column column) { 76 | return new NumberBox(session, column); 77 | } 78 | }); 79 | 80 | add(SelectEditor.class, Cardinality.ONE, new Factory() { 81 | @Override 82 | public Widget create(Session session, Column column) { 83 | return new SelectEditorWidget(session, column, false); 84 | } 85 | }); 86 | 87 | add(SelectEditor.class, Cardinality.MULTI, new Factory() { 88 | @Override 89 | public Widget create(Session session, Column column) { 90 | return new SelectEditorWidget(session, column, true); 91 | } 92 | }); 93 | } 94 | 95 | 96 | 97 | /** 98 | * 99 | * @param col 100 | * @param operator 101 | * @return an, opaque, key. Only equals and hashCode should be used. 102 | */ 103 | static Object createKey(Column col, Operator operator) { 104 | return col.getEditor().getClass().getName() + "_" + operator.getCardinality().name(); 105 | } 106 | 107 | static Widget create(Object key, Session session, Column col) { 108 | Factory factory = KEY_TO_FACTORY.get(key); 109 | if (factory == null) { 110 | throw new RuntimeException("Unknown editor " + col.getEditor()); 111 | } 112 | 113 | return factory.create(session, col); 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/Expression.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | 4 | import java.util.List; 5 | 6 | import com.redspr.redquerybuilder.core.client.BaseSqlWidget; 7 | import com.redspr.redquerybuilder.core.client.engine.Session; 8 | 9 | public class Expression extends BaseSqlWidget { 10 | 11 | public Expression(Session session) { 12 | super(session); 13 | // initWidget(new Label("E" + getClass().getName())); 14 | } 15 | 16 | public String getSQL(List args) { 17 | return "blah"; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/Nop.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | 4 | import java.util.List; 5 | 6 | import com.google.gwt.user.client.ui.Label; 7 | 8 | public class Nop extends Expression { 9 | public Nop() { 10 | super(null); 11 | initWidget(new Label()); 12 | } 13 | 14 | @Override 15 | public String getSQL(List args) { 16 | return "1=1"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/Null.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | 4 | import java.util.List; 5 | 6 | import com.google.gwt.user.client.ui.Label; 7 | 8 | public class Null extends Expression { 9 | public Null() { 10 | super(null); 11 | initWidget(new Label()); 12 | } 13 | 14 | @Override 15 | public String getSQL(List args) { 16 | return "NULL"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/Parameter.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.List; 6 | 7 | import com.google.gwt.event.logical.shared.ValueChangeEvent; 8 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 9 | import com.google.gwt.user.client.ui.HasValue; 10 | import com.google.gwt.user.client.ui.SimplePanel; 11 | import com.google.gwt.user.client.ui.Widget; 12 | import com.redspr.redquerybuilder.core.client.HasMessages; 13 | import com.redspr.redquerybuilder.core.client.Message; 14 | import com.redspr.redquerybuilder.core.client.engine.Session; 15 | import com.redspr.redquerybuilder.core.shared.meta.Column; 16 | import com.redspr.redquerybuilder.core.shared.meta.HasValue2; 17 | 18 | /** 19 | * A parameter of a prepared statement. 20 | */ 21 | public class Parameter extends Expression implements HasMessages { 22 | 23 | private Object value; 24 | 25 | private Column lastColumn; 26 | 27 | private Object lastEditorKey; 28 | 29 | private final SimplePanel lb = new SimplePanel(); 30 | 31 | public Parameter(Session session) { 32 | super(session); 33 | 34 | initWidget(lb); 35 | 36 | value = session.getValueRegistry().getY().getValue(); 37 | } 38 | 39 | public Parameter(Session session, int index) { 40 | super(session); 41 | 42 | initWidget(lb); 43 | 44 | value = session.getValueRegistry().getY(index).getValue(); 45 | } 46 | 47 | public Parameter(Session session, Collection children) { 48 | super(session); 49 | 50 | initWidget(lb); // XXX three times now 51 | List value2 = new ArrayList(); 52 | for (Expression child : children) { 53 | if (child instanceof Null) { 54 | continue; 55 | } 56 | value2.add(((Parameter) child).value); 57 | } 58 | value = value2; 59 | } 60 | 61 | @Override 62 | public String getSQL(List args) { 63 | if (value instanceof Collection) { 64 | StringBuilder sb = new StringBuilder(); 65 | Collection a = (Collection) value; 66 | if (a.isEmpty()) { 67 | sb.append("(NULL)"); 68 | } else { 69 | for (Object o : a) { 70 | if (sb.length() == 0) { 71 | sb.append("(?"); 72 | } else { 73 | sb.append(", ?"); 74 | } 75 | args.add(o); 76 | } 77 | sb.append(')'); 78 | } 79 | 80 | return sb.toString(); 81 | } else { 82 | args.add(value); 83 | return "?"; 84 | } 85 | } 86 | 87 | @Override 88 | public void onDirty() { 89 | Comparison parent = (Comparison) this.getParentExpression(); 90 | 91 | ExpressionColumn otherSide = (ExpressionColumn) parent.getOther(this); 92 | Column col = otherSide.getColumn(); 93 | 94 | Object newEditorKey = EditorWidgetFactory.createKey(col, 95 | parent.getOperator()); 96 | 97 | if (lastColumn != col || !newEditorKey.equals(lastEditorKey)) { 98 | 99 | final Widget w = EditorWidgetFactory.create(newEditorKey, getSession(), 100 | col); 101 | 102 | lb.setWidget(w); 103 | final HasValue hv = (HasValue) w; 104 | hv.addValueChangeHandler(new ValueChangeHandler() { 105 | @Override 106 | public void onValueChange(ValueChangeEvent event) { 107 | value = hv.getValue(); 108 | if (value instanceof HasValue2) { 109 | value = ((HasValue2) value).getValue(); 110 | } 111 | fireDirty(); 112 | } 113 | }); 114 | 115 | if (lastEditorKey != null || value == null) { 116 | value = col.getEditor().getDefault(); 117 | } 118 | 119 | hv.setValue(value, false); 120 | 121 | lastColumn = col; 122 | lastEditorKey = newEditorKey; 123 | 124 | String style = col.getStyleName(); 125 | if (style != null) { 126 | w.addStyleName(style); 127 | } 128 | } 129 | } 130 | 131 | public Widget getEditorWidget() { 132 | return lb.getWidget(); 133 | } 134 | 135 | @Override 136 | public void showMessage(Message message) { 137 | if (message != null) { 138 | lb.setTitle(message.getText()); 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/SelectEditorWidget.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2010-2013 Redspr Ltd. 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the Eclipse Public License v1.0 5 | * which accompanies this distribution, and is available at 6 | * http://www.eclipse.org/legal/epl-v10.html 7 | * 8 | * Contributors: 9 | * Sam Hough - initial API and implementation 10 | *******************************************************************************/ 11 | package com.redspr.redquerybuilder.core.client.expression; 12 | 13 | import java.util.LinkedHashMap; 14 | import java.util.Map; 15 | 16 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 17 | import com.google.gwt.event.shared.HandlerRegistration; 18 | import com.google.gwt.text.shared.AbstractRenderer; 19 | import com.google.gwt.text.shared.Renderer; 20 | import com.google.gwt.user.client.rpc.AsyncCallback; 21 | import com.google.gwt.user.client.ui.Composite; 22 | import com.google.gwt.user.client.ui.HasConstrainedValue; 23 | import com.google.gwt.user.client.ui.HasValue; 24 | import com.google.gwt.user.client.ui.SuggestOracle; 25 | import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; 26 | import com.google.gwt.user.client.ui.ValueListBox; 27 | import com.google.gwt.user.client.ui.Widget; 28 | import com.redspr.redquerybuilder.core.client.engine.Session; 29 | import com.redspr.redquerybuilder.core.shared.meta.Column; 30 | import com.redspr.redquerybuilder.core.shared.meta.EnumerateRequest; 31 | 32 | 33 | public class SelectEditorWidget extends Composite implements HasValue { 34 | private final String tableName; 35 | private final String columnName; 36 | private final String columnType; 37 | private final HasValue box; 38 | 39 | private final Map keyToTitle = new LinkedHashMap(); 40 | 41 | private final Renderer renderer = new AbstractRenderer() { 42 | @Override 43 | public String render(Object object) { 44 | return keyToTitle.get(object); 45 | } 46 | }; 47 | 48 | 49 | // XXX is holding onto column anyway 50 | SelectEditorWidget(Session session, final Column col, boolean multi) { 51 | if (multi) { 52 | box = new ValueMultiListBox(renderer); 53 | } else { 54 | box = new ValueListBox(renderer); 55 | } 56 | tableName = col.getTable().getName(); 57 | columnName = col.getName(); 58 | columnType = col.getType().getName(); 59 | 60 | initWidget((Widget) box); 61 | 62 | Object v = col.getEditor().getDefault(); 63 | box.setValue(v); 64 | 65 | EnumerateRequest er = new EnumerateRequest(); 66 | er.setTableName(tableName); 67 | er.setColumnName(columnName); 68 | er.setColumnTypeName(columnType); 69 | 70 | // XXX make all async? 71 | session.getConfig().fireEnumerate(er, 72 | new AsyncCallback() { 73 | 74 | @Override 75 | public void onFailure(Throwable caught) { 76 | throw new RuntimeException( 77 | "not AsyncCallback.onFailure implemented", 78 | caught); 79 | } 80 | 81 | @Override 82 | public void onSuccess(SuggestOracle.Response result) { 83 | Object v = col.getEditor().getDefault(); 84 | 85 | if (box instanceof ValueListBox) { 86 | keyToTitle.put(v, "Please select..."); 87 | } 88 | for (Suggestion s : result.getSuggestions()) { 89 | keyToTitle.put(s.getReplacementString(), s.getDisplayString()); 90 | } 91 | 92 | if (box instanceof HasConstrainedValue) { 93 | ((HasConstrainedValue) box).setAcceptableValues(keyToTitle.keySet()); 94 | } else { 95 | ((ValueMultiListBox) box).setAcceptableValues(keyToTitle.keySet()); 96 | } 97 | } 98 | }); 99 | } 100 | 101 | @Override 102 | public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { 103 | return box.addValueChangeHandler(handler); 104 | } 105 | 106 | @Override 107 | public Object getValue() { 108 | return box.getValue(); 109 | } 110 | 111 | @Override 112 | public void setValue(Object value) { 113 | setValue(value, false); 114 | } 115 | 116 | @Override 117 | public void setValue(Object value, boolean fireEvents) { 118 | box.setValue(value, fireEvents); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/Wildcard.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import java.util.List; 4 | 5 | import com.redspr.redquerybuilder.core.client.engine.Session; 6 | 7 | public class Wildcard extends Expression { 8 | 9 | private final String table; 10 | 11 | public Wildcard(Session session, String schema, String table) { 12 | super(session); 13 | this.table = table; 14 | } 15 | 16 | @Override 17 | public String getSQL(List args) { 18 | if (table == null) { 19 | return "*"; 20 | } 21 | return getSession().quoteIdentifier(table) + ".*"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.expression; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/table/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.table; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/CommandListBox.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.util; 2 | 3 | 4 | import com.google.gwt.event.logical.shared.ValueChangeEvent; 5 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 6 | import com.google.gwt.user.client.Command; 7 | import com.redspr.redquerybuilder.core.client.BaseSqlWidget; 8 | 9 | public class CommandListBox extends ListBox2 { 10 | private final BaseSqlWidget widget; 11 | 12 | public CommandListBox(BaseSqlWidget p) { 13 | this.widget = p; 14 | this.addValueChangeHandler(new ValueChangeHandler() { 15 | @Override 16 | public void onValueChange(ValueChangeEvent event) { 17 | event.getValue().execute(); 18 | widget.fireDirty(); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/CommandWithLabel.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.util; 2 | 3 | import com.google.gwt.user.client.Command; 4 | import com.redspr.redquerybuilder.core.shared.meta.HasLabel; 5 | 6 | /** 7 | * 8 | * A Command with a Label. 9 | * 10 | */ 11 | public abstract class CommandWithLabel implements Command, HasLabel { 12 | private final String e; 13 | 14 | public CommandWithLabel(HasLabel e2) { 15 | this(e2.getLabel()); 16 | } 17 | 18 | public CommandWithLabel(String e2) { 19 | this.e = e2; 20 | if (e == null) { 21 | throw new IllegalArgumentException("Label must not be null"); 22 | } 23 | } 24 | 25 | @Override 26 | public String getLabel() { 27 | return e; 28 | } 29 | 30 | @Override 31 | public int hashCode() { 32 | return e.hashCode(); 33 | } 34 | 35 | @Override 36 | public boolean equals(Object p) { 37 | if (p instanceof CommandWithLabel) { 38 | CommandWithLabel p2 = (CommandWithLabel) p; 39 | return e.equals(p2.e); 40 | } 41 | return false; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/JsStringArray.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.util; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | 5 | // TODO 02 replace with standard JsArrayString 6 | public class JsStringArray extends JavaScriptObject { 7 | protected JsStringArray() { 8 | } 9 | 10 | public final native int size() /*-{ 11 | return this.length; 12 | }-*/; 13 | 14 | public final native String get(int i) /*-{ 15 | return this[i]; 16 | }-*/; 17 | 18 | public final native void add(String p) /*-{ 19 | this.push(p); 20 | }-*/; 21 | 22 | public static final JsStringArray create() { 23 | return (JsStringArray) JavaScriptObject.createArray(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/ListBox2.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.util; 2 | 3 | import java.util.Arrays; 4 | 5 | import com.google.gwt.text.shared.AbstractRenderer; 6 | import com.google.gwt.user.client.ui.ValueListBox; 7 | import com.redspr.redquerybuilder.core.shared.meta.HasLabel; 8 | 9 | public class ListBox2 extends ValueListBox { 10 | 11 | public ListBox2() { 12 | super(new AbstractRenderer() { 13 | @Override 14 | public String render(T object) { 15 | if (object instanceof HasLabel) { 16 | return ((HasLabel) object).getLabel(); 17 | } 18 | return "" + object; 19 | } 20 | }); 21 | } 22 | 23 | public void setAcceptableValues(T[] p) { 24 | this.setAcceptableValues(Arrays.asList(p)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/NumberBox.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.util; 2 | 3 | import com.google.gwt.dom.client.Document; 4 | import com.google.gwt.text.client.DoubleParser; 5 | import com.google.gwt.text.shared.AbstractRenderer; 6 | import com.google.gwt.user.client.ui.ValueBox; 7 | import com.redspr.redquerybuilder.core.client.engine.Session; 8 | import com.redspr.redquerybuilder.core.shared.meta.Column; 9 | import com.redspr.redquerybuilder.core.shared.meta.Editor; 10 | 11 | public class NumberBox extends ValueBox { 12 | 13 | private static final Double ONE = new Double(1.0); 14 | 15 | // HTML5 input=number fields don't like commas etc 16 | private static final AbstractRenderer RENDERER = new AbstractRenderer() { 17 | @Override 18 | public String render(Double object) { 19 | if (object == null) { 20 | return ""; 21 | } 22 | return "" + object; 23 | } 24 | }; 25 | 26 | public NumberBox(Session session, Column column) { 27 | super(Document.get().createTextInputElement(), RENDERER, 28 | DoubleParser.instance()); 29 | 30 | // HTML5 browser might pick up on this 31 | getElement().setAttribute("type", "number"); 32 | 33 | Editor editor = column.getEditor(); 34 | Double step = (Double) editor.getAttribute("step"); 35 | if (step == null) { 36 | step = ONE; 37 | } 38 | getElement().setAttribute("step", step.toString()); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/StatementBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License, 3 | * Version 1.0, and under the Eclipse Public License, Version 1.0 4 | * (http://h2database.com/html/license.html). 5 | * Initial Developer: H2 Group 6 | * 7 | * Nicolas Fortin, Atelier SIG, IRSTV FR CNRS 24888 8 | * Support for the operator "&&" as an alias for SPATIAL_INTERSECTS 9 | */ 10 | package com.redspr.redquerybuilder.core.client.util; 11 | 12 | /** 13 | * A utility class to build a statement. In addition to the methods supported by 14 | * StringBuilder, it allows to add a text only in the second iteration. This 15 | * simplified constructs such as: 16 | *
 17 |  * StringBuilder buff = new StringBuilder();
 18 |  * for (int i = 0; i < args.length; i++) {
 19 |  *     if (i > 0) {
 20 |  *         buff.append(", ");
 21 |  *     }
 22 |  *     buff.append(args[i]);
 23 |  * }
 24 |  * 
25 | * to 26 | *
 27 |  * StatementBuilder buff = new StatementBuilder();
 28 |  * for (String s : args) {
 29 |  *     buff.appendExceptFirst(", ");
 30 |  *     buff.append(a);
 31 |  * }
 32 |  *
33 | */ 34 | public class StatementBuilder { 35 | 36 | private final StringBuilder builder = new StringBuilder(); 37 | private int index; 38 | 39 | /** 40 | * Create a new builder. 41 | */ 42 | public StatementBuilder() { 43 | // nothing to do 44 | } 45 | 46 | /** 47 | * Create a new builder. 48 | * 49 | * @param string the initial string 50 | */ 51 | public StatementBuilder(String string) { 52 | builder.append(string); 53 | } 54 | 55 | /** 56 | * Append a text. 57 | * 58 | * @param s the text to append 59 | * @return itself 60 | */ 61 | public StatementBuilder append(String s) { 62 | builder.append(s); 63 | return this; 64 | } 65 | 66 | /** 67 | * Append a character. 68 | * 69 | * @param c the character to append 70 | * @return itself 71 | */ 72 | public StatementBuilder append(char c) { 73 | builder.append(c); 74 | return this; 75 | } 76 | 77 | /** 78 | * Append a number. 79 | * 80 | * @param x the number to append 81 | * @return itself 82 | */ 83 | public StatementBuilder append(long x) { 84 | builder.append(x); 85 | return this; 86 | } 87 | 88 | /** 89 | * Reset the loop counter. 90 | * 91 | * @return itself 92 | */ 93 | public StatementBuilder resetCount() { 94 | index = 0; 95 | return this; 96 | } 97 | 98 | /** 99 | * Append a text, but only if appendExceptFirst was never called. 100 | * 101 | * @param s the text to append 102 | */ 103 | public void appendOnlyFirst(String s) { 104 | if (index == 0) { 105 | builder.append(s); 106 | } 107 | } 108 | 109 | /** 110 | * Append a text, except when this method is called the first time. 111 | * 112 | * @param s the text to append 113 | */ 114 | public void appendExceptFirst(String s) { 115 | if (index++ > 0) { 116 | builder.append(s); 117 | } 118 | } 119 | 120 | @Override 121 | public String toString() { 122 | return builder.toString(); 123 | } 124 | 125 | /** 126 | * Get the length. 127 | * 128 | * @return the length 129 | */ 130 | public int length() { 131 | return builder.length(); 132 | } 133 | 134 | } 135 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/XWidget.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.util; 2 | 3 | import com.google.gwt.user.client.ui.SimplePanel; 4 | import com.google.gwt.user.client.ui.Widget; 5 | 6 | public class XWidget extends SimplePanel { 7 | public T getValue() { 8 | return (T) getWidget(); 9 | } 10 | 11 | public void setValue(T p) { 12 | setWidget(p); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/util/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.util; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/value/Value.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.value; 2 | 3 | public class Value { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/value/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.client.value; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/config/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.config; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Cardinality.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import com.google.gwt.user.client.rpc.IsSerializable; 4 | 5 | public enum Cardinality implements IsSerializable { 6 | ZERO, ONE, MULTI; 7 | } 8 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Column.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.google.gwt.user.client.rpc.IsSerializable; 6 | 7 | public class Column implements HasLabel, HasStyleName, Serializable, IsSerializable { 8 | private String name; 9 | private String label; 10 | private Type type; 11 | private Table table; 12 | 13 | private String styleName; 14 | 15 | private boolean hidden; 16 | 17 | private Editor editor; 18 | 19 | public Column() { 20 | } 21 | 22 | public Column(String name2, Type type2) { 23 | this.name = name2; 24 | this.label = name2; 25 | this.type = type2; 26 | } 27 | 28 | public Editor getEditor() { 29 | if (editor == null) { 30 | return type.getEditor(); 31 | } 32 | return editor; 33 | } 34 | 35 | public void setEditor(Editor p) { 36 | this.editor = p; 37 | } 38 | 39 | public boolean isHidden() { 40 | return hidden; 41 | } 42 | 43 | public void setHidden(boolean p) { 44 | this.hidden = p; 45 | } 46 | 47 | public String getName() { 48 | return name; 49 | } 50 | 51 | public Type getType() { 52 | return type; 53 | } 54 | 55 | public void setTable(Table p) { 56 | this.table = p; 57 | } 58 | 59 | public Table getTable() { 60 | return table; 61 | } 62 | 63 | public void setLabel(String p) { 64 | this.label = p; 65 | } 66 | 67 | @Override 68 | public String getLabel() { 69 | return label; 70 | } 71 | 72 | public String getStyleName() { 73 | if (styleName == null) { 74 | return getType().getStyleName(); 75 | } 76 | return styleName; 77 | } 78 | 79 | @Override 80 | public void setStyleName(String p) { 81 | this.styleName = p; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Constraint.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | 4 | 5 | public abstract class Constraint extends SchemaObjectBase { 6 | private Table table; 7 | 8 | // for GWT RPC 9 | public Constraint() { 10 | } 11 | 12 | Constraint(String name, Table t) { 13 | setObjectName(name); 14 | this.table = t; 15 | } 16 | 17 | public Table getTable() { 18 | return table; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/ConstraintReferential.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | 4 | 5 | public class ConstraintReferential extends Constraint { 6 | private Column[] columns; 7 | 8 | private Table refTable; 9 | 10 | private Column[] refColumns; 11 | 12 | private String revName; 13 | 14 | private boolean hidden; 15 | 16 | private boolean revHidden; 17 | 18 | public boolean isHidden() { 19 | return hidden; 20 | } 21 | 22 | public void setHidden(boolean p) { 23 | this.hidden = p; 24 | } 25 | 26 | public boolean isRevHidden() { 27 | return revHidden; 28 | } 29 | 30 | public void setRevHidden(boolean p) { 31 | this.revHidden = p; 32 | } 33 | 34 | public String getRevName() { 35 | return revName; 36 | } 37 | 38 | public void setRevName(String p) { 39 | this.revName = p; 40 | } 41 | 42 | // for GWT RPC 43 | public ConstraintReferential() { 44 | } 45 | 46 | public ConstraintReferential(String name, Table t) { 47 | super(name, t); 48 | } 49 | 50 | public Column[] getColumns() { 51 | return columns; 52 | } 53 | 54 | public void setColumns(Column[] p) { 55 | this.columns = p; 56 | } 57 | 58 | public Column[] getRefColumns() { 59 | return refColumns; 60 | } 61 | 62 | public void setRefColumns(Column[] p) { 63 | this.refColumns = p; 64 | } 65 | 66 | public Table getRefTable() { 67 | return refTable; 68 | } 69 | 70 | public void setRefTable(Table p) { 71 | this.refTable = p; 72 | } 73 | 74 | @Override 75 | public String toString() { 76 | return "FK:" + getName() + "(" + getTable() + " to " + getRefTable() + ")"; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Database.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.google.gwt.user.client.rpc.IsSerializable; 6 | 7 | 8 | /** 9 | * There is one database object per open database. 10 | * 11 | * The format of the meta data table is: 12 | * id int, headPos int (for indexes), objectType int, sql varchar 13 | * 14 | * @since 2004-04-15 22:49 15 | */ 16 | public class Database implements Serializable, IsSerializable { 17 | 18 | private String databaseName; 19 | private String databaseShortName; 20 | 21 | private Schema mainSchema; 22 | 23 | private Type[] types; 24 | 25 | 26 | public Database() { 27 | this(new Schema()); 28 | } 29 | 30 | public Database(Schema s) { 31 | mainSchema = s; 32 | } 33 | 34 | public Type[] getTypes() { 35 | return types; 36 | } 37 | 38 | public void setTypes(Type[] p) { 39 | this.types = p; 40 | } 41 | 42 | public Type getTypeByName(String typeName) { 43 | for (Type t : types) { 44 | if (typeName.equals(t.getName())) { 45 | return t; 46 | } 47 | } 48 | throw new RuntimeException("Could not find type '" + typeName + "'"); 49 | } 50 | 51 | public Operator getOperatorByName(String name) { 52 | for (Type type: types) { 53 | for (Operator op : type.getOperators()) { 54 | if (name.equals(op.getName())) { 55 | return op; 56 | } 57 | } 58 | } 59 | 60 | return null; 61 | } 62 | 63 | public Schema getMainSchema() { 64 | return mainSchema; 65 | } 66 | 67 | public String getName() { 68 | return databaseName; 69 | } 70 | 71 | @Override 72 | public String toString() { 73 | return databaseShortName + ":" + super.toString(); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/DbObject.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.google.gwt.user.client.rpc.IsSerializable; 6 | 7 | /** 8 | * A database object such as a table, an index, or a user. 9 | */ 10 | public interface DbObject extends Serializable, IsSerializable { 11 | 12 | /** 13 | * The object is of the type table or view. 14 | */ 15 | int TABLE_OR_VIEW = 0; 16 | 17 | /** 18 | * This object is an index. 19 | */ 20 | int INDEX = 1; 21 | 22 | /** 23 | * This object is a user. 24 | */ 25 | int USER = 2; 26 | 27 | /** 28 | * This object is a sequence. 29 | */ 30 | int SEQUENCE = 3; 31 | 32 | /** 33 | * This object is a trigger. 34 | */ 35 | int TRIGGER = 4; 36 | 37 | /** 38 | * This object is a constraint (check constraint, unique constraint, or 39 | * referential constraint). 40 | */ 41 | int CONSTRAINT = 5; 42 | 43 | /** 44 | * This object is a setting. 45 | */ 46 | int SETTING = 6; 47 | 48 | /** 49 | * This object is a role. 50 | */ 51 | int ROLE = 7; 52 | 53 | /** 54 | * This object is a right. 55 | */ 56 | int RIGHT = 8; 57 | 58 | /** 59 | * This object is an alias for a Java function. 60 | */ 61 | int FUNCTION_ALIAS = 9; 62 | 63 | /** 64 | * This object is a schema. 65 | */ 66 | int SCHEMA = 10; 67 | 68 | /** 69 | * This object is a constant. 70 | */ 71 | int CONSTANT = 11; 72 | 73 | /** 74 | * This object is a user data type (domain). 75 | */ 76 | int USER_DATATYPE = 12; 77 | 78 | /** 79 | * This object is a comment. 80 | */ 81 | int COMMENT = 13; 82 | 83 | /** 84 | * This object is a user-defined aggregate function. 85 | */ 86 | int AGGREGATE = 14; 87 | 88 | 89 | 90 | /** 91 | * Get the SQL name of this object (may be quoted). 92 | * 93 | * @return the SQL name 94 | */ 95 | String getSQL(); 96 | 97 | /** 98 | * Get the name. 99 | * 100 | * @return the name 101 | */ 102 | String getName(); 103 | 104 | 105 | } 106 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/DbObjectBase.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import com.redspr.redquerybuilder.core.client.engine.Session; 4 | 5 | /** 6 | * The base class for all database objects. 7 | */ 8 | public abstract class DbObjectBase implements DbObject, HasLabel { 9 | 10 | private String objectName; 11 | 12 | private String label; 13 | 14 | protected void setObjectName(String name) { 15 | objectName = name; 16 | } 17 | 18 | public void setLabel(String p) { 19 | this.label = p; 20 | } 21 | 22 | @Override 23 | public String getSQL() { 24 | return Session.quoteIdentifier(objectName); 25 | } 26 | 27 | @Override 28 | public String getName() { 29 | return objectName; 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return objectName + ":" + super.toString(); 35 | } 36 | 37 | @Override 38 | public String getLabel() { 39 | if (label != null) { 40 | return label; 41 | } 42 | return objectName; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Editor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import java.io.Serializable; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | 7 | import com.google.gwt.user.client.rpc.IsSerializable; 8 | 9 | // XXX custom editors in Config? 10 | public class Editor implements HasStyleName, Serializable, IsSerializable { 11 | public static class TextEditor extends Editor { 12 | @Override 13 | public Object getDefault() { 14 | return ""; 15 | } 16 | } 17 | 18 | public static class DateEditor extends Editor { 19 | public static final String FORMAT = "format"; 20 | } 21 | 22 | public static class BooleanEditor extends Editor { 23 | @Override 24 | public Object getDefault() { 25 | return Boolean.FALSE; 26 | } 27 | } 28 | 29 | public static class SelectEditor extends Editor { 30 | 31 | } 32 | 33 | public static class NumberEditor extends Editor { 34 | } 35 | 36 | 37 | // XXX - rubbish, only used by JSON? 38 | private static final Map editorByName = new HashMap(); 39 | 40 | private static Editor valueOf2(String name) { 41 | if ("STRING".equals(name) || "TEXT".equals(name)) { 42 | return new TextEditor(); 43 | } else if ("DATE".equals(name)) { 44 | return new DateEditor(); 45 | } else if ("SUGGEST".equals(name)) { 46 | return new SuggestEditor(); 47 | } else if ("SELECT".equals(name)) { 48 | return new SelectEditor(); 49 | } else if ("NUMBER".equals(name)) { 50 | return new NumberEditor(); 51 | } else { 52 | throw new RuntimeException("No editor for " + name); 53 | } 54 | } 55 | 56 | public static Editor valueOf(String name) { 57 | Editor e = editorByName.get(name); 58 | if (e == null) { 59 | e = valueOf2(name); 60 | editorByName.put(name, e); 61 | } 62 | return e; 63 | } 64 | 65 | // XXX map mush 66 | private final Map attributes = new HashMap(); 67 | 68 | private String styleName; 69 | 70 | public Object getDefault() { 71 | return null; 72 | } 73 | 74 | public void setAttribute(String name, Object value) { 75 | attributes.put(name, value); 76 | } 77 | 78 | public Object getAttribute(String name) { 79 | return attributes.get(name); 80 | } 81 | 82 | public String getStyleName() { 83 | return styleName; 84 | } 85 | 86 | @Override 87 | public void setStyleName(String p) { 88 | this.styleName = p; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/EnumerateRequest.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | public class EnumerateRequest { 4 | private String tableName; 5 | 6 | private String columnName; 7 | 8 | private String columnType; 9 | 10 | public String getTableName() { 11 | return tableName; 12 | } 13 | 14 | public void setTableName(String p) { 15 | this.tableName = p; 16 | } 17 | 18 | public String getColumnName() { 19 | return columnName; 20 | } 21 | 22 | public void setColumnName(String p) { 23 | this.columnName = p; 24 | } 25 | 26 | public String getColumnTypeName() { 27 | return columnType; 28 | } 29 | 30 | public void setColumnTypeName(String p) { 31 | this.columnType = p; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/HasLabel.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | public interface HasLabel { 4 | String getLabel(); 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/HasStyleName.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | public interface HasStyleName { 4 | void setStyleName(String p); 5 | } 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/HasValue2.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import com.google.gwt.user.client.rpc.IsSerializable; 4 | 5 | public interface HasValue2 extends IsSerializable { 6 | Object getValue(); 7 | } 8 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Operator.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import com.google.gwt.user.client.rpc.IsSerializable; 4 | 5 | public class Operator implements HasLabel, IsSerializable { 6 | 7 | public static final String EQUAL = "="; 8 | public static final String NOT_EQUAL = "<>"; 9 | public static final String BIGGER = ">"; 10 | public static final String SMALLER = "<"; 11 | public static final String SMALLER_EQUAL = "<="; 12 | public static final String BIGGER_EQUAL = ">="; 13 | public static final String IS_NULL = "IS NULL"; 14 | public static final String IS_NOT_NULL = "IS NOT NULL"; 15 | 16 | private String name; 17 | private String label; 18 | 19 | private Cardinality cardinality; 20 | 21 | // For GWT RPC 22 | private Operator() { 23 | } 24 | 25 | public Operator(String name2) { 26 | this(name2, Cardinality.ONE); 27 | } 28 | 29 | public Operator(String name2, Cardinality c2) { 30 | this.name = name2; 31 | this.label = name; 32 | this.cardinality = c2; 33 | } 34 | 35 | @Override 36 | public String getLabel() { 37 | return label; 38 | } 39 | 40 | public Cardinality getCardinality() { 41 | return cardinality; 42 | } 43 | 44 | public String getName() { 45 | return name; 46 | } 47 | 48 | public void setLabel(String p) { 49 | this.label = p; 50 | } 51 | 52 | public void setCardinality(Cardinality p) { 53 | this.cardinality = p; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Schema.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.LinkedHashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | 10 | 11 | public class Schema extends DbObjectBase { 12 | private final Map tables = new LinkedHashMap(); 13 | 14 | public Table findTableOrView(String name) { 15 | return tables.get(name.toUpperCase()); 16 | } 17 | 18 | public Collection getTables() { 19 | return tables.values(); 20 | } 21 | 22 | public void add(Table p) { 23 | tables.put(p.getName().toUpperCase(), p); 24 | } 25 | 26 | // XXX better place for this? 27 | // only internal "optimisation"? 28 | public void addReverseConstraints() { 29 | List crs = new ArrayList(); 30 | for (Table t : getTables()) { 31 | for (Constraint c : t.getConstraints()) { 32 | if (c instanceof ConstraintReferential) { 33 | crs.add((ConstraintReferential) c); 34 | } 35 | } 36 | } 37 | 38 | for (ConstraintReferential cr : crs) { 39 | String title = cr.getRevName(); 40 | if (title == null) { 41 | title = "Rev " + cr.getName(); 42 | } 43 | ConstraintReferential cr2 = new ConstraintReferential(title, cr.getRefTable()); 44 | cr2.setRefColumns(cr.getColumns()); 45 | cr2.setColumns(cr.getRefColumns()); 46 | cr2.setRefTable(cr.getTable()); 47 | cr.getRefTable().add(cr2); 48 | cr2.setHidden(cr.isRevHidden()); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/SchemaObject.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | 4 | /** 5 | * Any database object that is stored in a schema. 6 | */ 7 | public interface SchemaObject extends DbObject { 8 | 9 | /** 10 | * Get the schema in which this object is defined 11 | * 12 | * @return the schema 13 | */ 14 | Schema getSchema(); 15 | } 16 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/SchemaObjectBase.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | 4 | /** 5 | * The base class for classes implementing SchemaObject. 6 | */ 7 | public abstract class SchemaObjectBase extends DbObjectBase implements SchemaObject { 8 | 9 | private Schema schema; 10 | 11 | @Override 12 | public Schema getSchema() { 13 | return schema; 14 | } 15 | 16 | @Override 17 | public String getSQL() { 18 | if (schema == null) { 19 | return super.getSQL(); // XXX legit for schema to be null? 20 | } 21 | return schema.getSQL() + "." + super.getSQL(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/SuggestEditor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | public class SuggestEditor extends Editor { 4 | private String key; 5 | 6 | public SuggestEditor() { 7 | } 8 | 9 | public SuggestEditor(String key2) { 10 | this.key = key2; 11 | } 12 | 13 | public String getKey() { 14 | return key; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/SuggestRequest.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | public class SuggestRequest extends EnumerateRequest { 4 | private int limit; 5 | 6 | private String query; 7 | 8 | public int getLimit() { 9 | return limit; 10 | } 11 | 12 | public void setLimit(int p) { 13 | this.limit = p; 14 | } 15 | 16 | public String getQuery() { 17 | return query; 18 | } 19 | 20 | public void setQuery(String p) { 21 | this.query = p; 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Table.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.LinkedHashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | 10 | 11 | 12 | public class Table extends SchemaObjectBase implements HasLabel { 13 | 14 | private final Map columns = new LinkedHashMap(); 15 | 16 | private final List constraints = new ArrayList(); 17 | 18 | private boolean hidden; 19 | 20 | 21 | public Table() { 22 | } 23 | 24 | public Table(String name) { 25 | setObjectName(name); 26 | } 27 | 28 | public void add(Column c) { 29 | c.setTable(this); 30 | columns.put(c.getName().toUpperCase(), c); 31 | } 32 | 33 | public Collection getColumns() { 34 | return columns.values(); 35 | } 36 | 37 | public Column getColumn(String name) { 38 | return columns.get(name.toUpperCase()); 39 | } 40 | 41 | public List getConstraints() { 42 | return constraints; 43 | } 44 | 45 | public Constraint getConstraintByName(String name) { 46 | for (Constraint c : constraints) { 47 | if (c.getName().equals(name)) { 48 | return c; 49 | } 50 | } 51 | throw new IllegalArgumentException("Unable to find constraint '" + name + "'"); 52 | } 53 | 54 | public void add(Constraint c) { 55 | constraints.add(c); 56 | } 57 | 58 | public boolean isHidden() { 59 | return hidden; 60 | } 61 | 62 | public void setHidden(boolean p) { 63 | this.hidden = p; 64 | } 65 | 66 | @Override 67 | public String toString() { 68 | return "Table:" + getName(); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/Type.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.shared.meta; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.google.gwt.user.client.rpc.IsSerializable; 6 | 7 | public class Type implements HasStyleName, Serializable, IsSerializable { 8 | private String name; 9 | 10 | private Operator[] operators = new Operator[] { 11 | new Operator("="), 12 | new Operator("IS NULL", Cardinality.ZERO), 13 | new Operator("LIKE") }; 14 | 15 | private Editor editor; 16 | 17 | private String styleName; 18 | 19 | // for GWT RPC 20 | private Type() { 21 | } 22 | 23 | public Type(String name2) { 24 | this(name2, new Editor.TextEditor()); 25 | } 26 | 27 | public Type(String name2, Editor editor2) { 28 | this.name = name2; 29 | this.editor = editor2; 30 | } 31 | 32 | public Operator[] getOperators() { 33 | return operators; 34 | } 35 | public void setOperators(Operator[] p) { 36 | this.operators = p; 37 | } 38 | public String getName() { 39 | return name; 40 | } 41 | 42 | public Editor getEditor() { 43 | return editor; 44 | } 45 | 46 | public void setEditor(Editor p) { 47 | this.editor = p; 48 | } 49 | 50 | public Operator getOperatorByName(String opName) { 51 | for (Operator op : operators) { 52 | if (opName.equals(op.getName())) { 53 | return op; 54 | } 55 | } 56 | return null; 57 | } 58 | 59 | public Operator getOperatorByNameOrFail(String opName) { 60 | Operator op = getOperatorByName(opName); 61 | if (op == null) { 62 | throw new RuntimeException("Could not find operator '" + opName 63 | + "' in type '" + name + "'"); 64 | } 65 | return op; 66 | } 67 | 68 | public String getStyleName() { 69 | if (styleName == null) { 70 | return getEditor().getStyleName(); 71 | } 72 | return styleName; 73 | } 74 | 75 | @Override 76 | public void setStyleName(String p) { 77 | this.styleName = p; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/shared/meta/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.core.shared.meta; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/java/RedQueryBuilderCoreJre.gwt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/java/math/BigDecimal.java: -------------------------------------------------------------------------------- 1 | package java.math; 2 | 3 | public class BigDecimal { 4 | public BigDecimal(BigInteger p) { 5 | } 6 | 7 | public BigDecimal(String p) { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/java/math/BigInteger.java: -------------------------------------------------------------------------------- 1 | package java.math; 2 | 3 | public class BigInteger { 4 | public BigInteger(String x, int i) { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/java/math/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package java.math; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/java/sql/SQLException.java: -------------------------------------------------------------------------------- 1 | package java.sql; 2 | 3 | public class SQLException extends Exception { 4 | public SQLException(String m) { 5 | super(m); 6 | } 7 | 8 | public SQLException(String m, Throwable t) { 9 | super(m, t); 10 | } 11 | 12 | 13 | public int getErrorCode() { 14 | return 0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/java/sql/Types.java: -------------------------------------------------------------------------------- 1 | package java.sql; 2 | 3 | 4 | //(version 1.5 : 49.0, super bit) 5 | public final class Types { 6 | 7 | private Types() { 8 | } 9 | 10 | // Field descriptor #19 I 11 | public static final int BIT = -7; 12 | 13 | // Field descriptor #19 I 14 | public static final int TINYINT = -6; 15 | 16 | // Field descriptor #19 I 17 | public static final int SMALLINT = 5; 18 | 19 | // Field descriptor #19 I 20 | public static final int INTEGER = 4; 21 | 22 | // Field descriptor #19 I 23 | public static final int BIGINT = -5; 24 | 25 | // Field descriptor #19 I 26 | public static final int FLOAT = 6; 27 | 28 | // Field descriptor #19 I 29 | public static final int REAL = 7; 30 | 31 | // Field descriptor #19 I 32 | public static final int DOUBLE = 8; 33 | 34 | // Field descriptor #19 I 35 | public static final int NUMERIC = 2; 36 | 37 | // Field descriptor #19 I 38 | public static final int DECIMAL = 3; 39 | 40 | // Field descriptor #19 I 41 | public static final int CHAR = 1; 42 | 43 | // Field descriptor #19 I 44 | public static final int VARCHAR = 12; 45 | 46 | // Field descriptor #19 I 47 | public static final int LONGVARCHAR = -1; 48 | 49 | // Field descriptor #19 I 50 | public static final int DATE = 91; 51 | 52 | // Field descriptor #19 I 53 | public static final int TIME = 92; 54 | 55 | // Field descriptor #19 I 56 | public static final int TIMESTAMP = 93; 57 | 58 | // Field descriptor #19 I 59 | public static final int BINARY = -2; 60 | 61 | // Field descriptor #19 I 62 | public static final int VARBINARY = -3; 63 | 64 | // Field descriptor #19 I 65 | public static final int LONGVARBINARY = -4; 66 | 67 | // Field descriptor #19 I 68 | public static final int NULL = 0; 69 | 70 | // Field descriptor #19 I 71 | public static final int OTHER = 1111; 72 | 73 | // Field descriptor #19 I 74 | public static final int JAVA_OBJECT = 2000; 75 | 76 | // Field descriptor #19 I 77 | public static final int DISTINCT = 2001; 78 | 79 | // Field descriptor #19 I 80 | public static final int STRUCT = 2002; 81 | 82 | // Field descriptor #19 I 83 | public static final int ARRAY = 2003; 84 | 85 | // Field descriptor #19 I 86 | public static final int BLOB = 2004; 87 | 88 | // Field descriptor #19 I 89 | public static final int CLOB = 2005; 90 | 91 | // Field descriptor #19 I 92 | public static final int REF = 2006; 93 | 94 | // Field descriptor #19 I 95 | public static final int DATALINK = 70; 96 | 97 | // Field descriptor #19 I 98 | public static final int BOOLEAN = 16; 99 | 100 | // Field descriptor #19 I 101 | public static final int ROWID = -8; 102 | 103 | // Field descriptor #19 I 104 | public static final int NCHAR = -15; 105 | 106 | // Field descriptor #19 I 107 | public static final int NVARCHAR = -9; 108 | 109 | // Field descriptor #19 I 110 | public static final int LONGNVARCHAR = -16; 111 | 112 | // Field descriptor #19 I 113 | public static final int NCLOB = 2011; 114 | 115 | // Field descriptor #19 I 116 | public static final int SQLXML = 2009; 117 | 118 | 119 | } 120 | 121 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/java/java/sql/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package java.sql; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | Archetype Created Web Application 7 | 8 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/CapturingConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import com.google.gwt.user.client.rpc.AsyncCallback; 4 | import com.google.gwt.user.client.ui.SuggestOracle.Response; 5 | import com.redspr.redquerybuilder.core.client.Configuration; 6 | import com.redspr.redquerybuilder.core.shared.meta.EnumerateRequest; 7 | 8 | public class CapturingConfiguration extends Configuration { 9 | 10 | private AsyncCallback enumerateCallback; 11 | 12 | public AsyncCallback getEnumerateCallback() { 13 | return enumerateCallback; 14 | } 15 | 16 | @Override 17 | public void fireEnumerate(EnumerateRequest request, AsyncCallback callback) { 18 | enumerateCallback = callback; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/GwtTestConf.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import org.junit.Test; 4 | 5 | 6 | public class GwtTestConf extends AbstractTest { 7 | 8 | 9 | @Test 10 | public void testMissingConf() throws Exception { 11 | 12 | } 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/GwtTestDom.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.junit.Test; 7 | 8 | import com.google.gwt.dom.client.Document; 9 | import com.google.gwt.dom.client.Element; 10 | import com.google.gwt.event.dom.client.ChangeEvent; 11 | import com.google.gwt.event.dom.client.ChangeHandler; 12 | import com.google.gwt.event.dom.client.DomEvent; 13 | import com.google.gwt.event.logical.shared.SelectionEvent; 14 | import com.google.gwt.event.logical.shared.SelectionHandler; 15 | import com.google.gwt.event.logical.shared.ValueChangeEvent; 16 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 17 | import com.google.gwt.user.client.ui.MultiWordSuggestOracle; 18 | import com.google.gwt.user.client.ui.RootPanel; 19 | import com.google.gwt.user.client.ui.SuggestBox; 20 | import com.google.gwt.user.client.ui.TextBox; 21 | 22 | public class GwtTestDom extends AbstractTest { 23 | 24 | 25 | @Test 26 | public void testTextBox() throws Exception { 27 | TextBox tb = new TextBox(); 28 | RootPanel.get().add(tb); 29 | final List events = new ArrayList(); 30 | tb.addChangeHandler(new ChangeHandler() { 31 | @Override 32 | public void onChange(ChangeEvent event) { 33 | events.add(event); 34 | } 35 | }); 36 | 37 | DomEvent.fireNativeEvent(Document.get().createChangeEvent(), tb); 38 | 39 | assertEquals(1, events.size()); 40 | } 41 | 42 | 43 | 44 | 45 | @Test 46 | public void testSuggestBox() throws Exception { 47 | this.delayTestFinish(1000); 48 | 49 | 50 | MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(); 51 | oracle.add("Cat"); 52 | oracle.add("Dog"); 53 | oracle.add("Horse"); 54 | oracle.add("Canary"); 55 | 56 | SuggestBox box = new SuggestBox(oracle); 57 | 58 | 59 | RootPanel.get().add(box); 60 | final List events = new ArrayList(); 61 | box.addValueChangeHandler(new ValueChangeHandler() { 62 | @Override 63 | public void onValueChange(ValueChangeEvent event) { 64 | events.add(event); 65 | } 66 | }); 67 | 68 | box.addSelectionHandler(new SelectionHandler() { 69 | 70 | @Override 71 | public void onSelection(SelectionEvent event) { 72 | events.add(event); 73 | finishTest(); 74 | } 75 | 76 | }); 77 | 78 | box.getElement().dispatchEvent(Document.get().createChangeEvent()); 79 | assertEquals(1, events.size()); 80 | 81 | box.getElement().setAttribute("value", "Ca"); 82 | box.getElement().dispatchEvent(Document.get().createKeyUpEvent(false, false, false, false, 'C')); 83 | 84 | //System.out.println("X=" + box.getElement().getParentElement().getInnerHTML()); 85 | List elmts = find(box.getElement(), "item"); 86 | assertEquals(2, elmts.size()); 87 | elmts.get(0).dispatchEvent(Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false)); 88 | // event fired as finally.. 89 | //assertEquals(2, events.size()); 90 | } 91 | 92 | } 93 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/GwtTestParsing.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client; 2 | 3 | import java.util.ArrayList; 4 | 5 | import org.junit.Test; 6 | 7 | import com.redspr.redquerybuilder.core.client.command.Parser; 8 | import com.redspr.redquerybuilder.core.client.command.dml.Select; 9 | import com.redspr.redquerybuilder.core.client.engine.Session; 10 | 11 | public class GwtTestParsing extends AbstractTest { 12 | 13 | // https://github.com/salk31/RedQueryBuilder/issues/42 14 | @Test 15 | public void testWildcard() throws Exception { 16 | Session sess = getSession(); 17 | Parser p = new Parser(sess); 18 | 19 | Select s = (Select) p.parseOnly("SELECT * FROM Log l"); 20 | String sql = s.getSQL(new ArrayList()); 21 | assertEquals("SELECT *\nFROM Log L", sql); 22 | } 23 | 24 | // https://github.com/salk31/RedQueryBuilder/issues/42 25 | @Test 26 | public void testAliasedWildcard() throws Exception { 27 | Session sess = getSession(); 28 | Parser p = new Parser(sess); 29 | 30 | Select s = (Select) p.parseOnly("SELECT l.* FROM Log l JOIN Person p ON l.parent = p.id"); 31 | String sql = s.getSQL(new ArrayList()); 32 | assertEquals("SELECT L.*\nFROM Log L\nINNER JOIN PERSON P ON L.PARENT = P.ID", sql); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/expression/AbstractEditorTest.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import java.util.Date; 4 | 5 | import org.junit.Ignore; 6 | import org.junit.Test; 7 | 8 | import com.google.gwt.user.client.Window; 9 | import com.google.gwt.user.client.ui.HasValue; 10 | import com.google.gwt.user.client.ui.Widget; 11 | import com.redspr.redquerybuilder.core.client.AbstractTest; 12 | import com.redspr.redquerybuilder.core.shared.meta.Cardinality; 13 | import com.redspr.redquerybuilder.core.shared.meta.Column; 14 | import com.redspr.redquerybuilder.core.shared.meta.Editor; 15 | import com.redspr.redquerybuilder.core.shared.meta.Operator; 16 | 17 | @Ignore 18 | public abstract class AbstractEditorTest extends AbstractTest { 19 | 20 | abstract protected Editor getEditor(); 21 | 22 | protected Cardinality getCardinality() { 23 | return Cardinality.ONE; 24 | } 25 | 26 | abstract protected T getExample1(); 27 | 28 | protected T getEmptyValue() { 29 | return null; 30 | } 31 | 32 | private Column getColumn() { 33 | Column c = new Column(); 34 | c.setEditor(getEditor()); 35 | return c; 36 | } 37 | 38 | private Operator getOperator() { 39 | Operator o = new Operator("TEST"); 40 | o.setCardinality(getCardinality()); 41 | return o; 42 | } 43 | 44 | private Widget asWidget() { 45 | Object key = EditorWidgetFactory.createKey(getColumn(), getOperator()); 46 | return EditorWidgetFactory.create(key, null, getColumn()); 47 | } 48 | 49 | private HasValue asHasValue() { 50 | return (HasValue) asWidget(); 51 | } 52 | 53 | @Test 54 | public void testNullInEmptyOut() { 55 | HasValue hasValue = asHasValue(); 56 | hasValue.setValue(null); 57 | assertEquals(getEmptyValue(), hasValue.getValue()); 58 | } 59 | 60 | @Test 61 | public void testValueInAndOut() { 62 | HasValue hasValue = asHasValue(); 63 | hasValue.setValue(getExample1()); 64 | T a = getExample1(); 65 | if (a instanceof Date) { 66 | Date x = (Date) a; 67 | Date y = (Date) hasValue.getValue(); 68 | Window.alert("x.time=" + x.getTime() + " y.time=" + y.getTime()); 69 | } 70 | assertEquals(getExample1(), hasValue.getValue()); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/expression/GwtTestDateEditor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import java.util.Date; 4 | 5 | import com.redspr.redquerybuilder.core.shared.meta.Editor; 6 | 7 | public class GwtTestDateEditor extends AbstractEditorTest { 8 | 9 | @Override 10 | protected Editor getEditor() { 11 | return new Editor.DateEditor(); 12 | } 13 | 14 | @Override 15 | protected Date getExample1() { 16 | return new Date(1971, 1, 6); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/expression/GwtTestNumberEditor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import com.redspr.redquerybuilder.core.shared.meta.Editor; 4 | 5 | public class GwtTestNumberEditor extends AbstractEditorTest { 6 | 7 | @Override 8 | protected Editor getEditor() { 9 | return new Editor.NumberEditor(); 10 | } 11 | 12 | @Override 13 | protected Double getExample1() { 14 | return new Double(3.15); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/expression/GwtTestSuggestEditorWidget.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.junit.Test; 7 | 8 | import com.google.gwt.core.client.Scheduler; 9 | import com.google.gwt.core.client.Scheduler.RepeatingCommand; 10 | import com.google.gwt.dom.client.Document; 11 | import com.google.gwt.dom.client.Element; 12 | import com.google.gwt.event.logical.shared.ValueChangeEvent; 13 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 14 | import com.google.gwt.user.client.ui.RootPanel; 15 | import com.redspr.redquerybuilder.core.client.AbstractTest; 16 | import com.redspr.redquerybuilder.core.client.engine.Session; 17 | import com.redspr.redquerybuilder.core.shared.meta.Column; 18 | 19 | public class GwtTestSuggestEditorWidget extends AbstractTest { 20 | 21 | @Test 22 | public void testDirtyKeepsValue() throws Exception { 23 | Session sess = getSession(); 24 | 25 | Column col = sess.getDatabase().getMainSchema() 26 | .findTableOrView("PERSON").getColumn("county"); 27 | 28 | final SuggestEditorWidget sew = new SuggestEditorWidget(sess, col); 29 | 30 | final List events = new ArrayList(); 31 | sew.addValueChangeHandler(new ValueChangeHandler() { 32 | @Override 33 | public void onValueChange(ValueChangeEvent event) { 34 | events.add(event.getValue()); 35 | } 36 | }); 37 | 38 | RootPanel.get().add(sew); 39 | 40 | Element elmt = sew.getElement(); 41 | 42 | elmt.setAttribute("value", "A"); 43 | elmt.dispatchEvent(Document.get().createKeyUpEvent(false, false, false, false, 'C')); 44 | 45 | //System.out.println("X=" + box.getElement().getParentElement().getInnerHTML()); 46 | List elmts = find(elmt.getParentElement(), "item"); 47 | assertEquals(3, elmts.size()); 48 | elmts.get(0).dispatchEvent(Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false)); 49 | 50 | this.delayTestFinish(10000); 51 | Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { 52 | @Override 53 | public boolean execute() { 54 | assertEquals(1, events.size()); 55 | finishTest(); 56 | return false; 57 | } 58 | }, 100); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /redquerybuilder-core/src/test/java/com/redspr/redquerybuilder/core/client/expression/GwtTestTextEditor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.core.client.expression; 2 | 3 | import com.redspr.redquerybuilder.core.shared.meta.Editor; 4 | 5 | public class GwtTestTextEditor extends AbstractEditorTest { 6 | 7 | @Override 8 | protected Editor getEditor() { 9 | return new Editor.TextEditor(); 10 | } 11 | 12 | @Override 13 | protected String getEmptyValue() { 14 | return ""; 15 | } 16 | 17 | @Override 18 | protected String getExample1() { 19 | return "Flomble"; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/README.txt: -------------------------------------------------------------------------------- 1 | Codeview is a template for JSDoc Toolkit. With JSDoc Toolkit you can generate a documentation website. 2 | 3 | The Codeview template is, like JSDoc Toolkit itself, published under the X11/MIT License. 4 | 5 | Codeview is Copyright (c) 2010 Wouter Bos (www.thebrightlines.com) -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/allclasses.tmpl: -------------------------------------------------------------------------------- 1 | {! Link.base = ""; /* all generated links will be relative to this */ !} 2 | {+subtemplate("subtemplates/head.tmpl", {subtitle: "Class Index"})+} 3 | {+subtemplate("subtemplates/menu.tmpl")+} 4 |
5 |
6 |
7 |

Class Index

8 | 9 |
    10 | 11 |
  • 12 |

    {+(new Link().toSymbol(thisClass.alias))+}

    13 |

    {+resolveLinks(summarize(thisClass.classDesc))+}

    14 |
  • 15 |
    16 |
17 |
18 |
19 |
20 | {+subtemplate("subtemplates/foot.tmpl")+} 21 | -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/allfiles.tmpl: -------------------------------------------------------------------------------- 1 | {! Link.base = ""; /* all generated links will be relative to this */ !} 2 | {+subtemplate("subtemplates/head.tmpl", {subtitle: "File Index"})+} 3 | {+subtemplate("subtemplates/menu.tmpl")+} 4 |
5 |
6 |
7 |

File Index

8 | 9 |
    10 | 11 |
  • 12 |

    {+new Link().toSrc(item.alias).withText(item.name)+}

    13 | 14 | {+resolveLinks(item.desc)+} 15 | 16 |
    17 | 18 |
    Author:
    19 |
    {+item.author+}
    20 |
    21 | 22 | 23 |
    Version:
    24 |
    {+item.version+}
    25 |
    26 | 27 | {! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !} 28 | 29 |
    Location:
    30 | 31 |
    {+location+}
    32 |
    33 |
    34 |
    35 |
  • 36 |
    37 |
38 |
39 |
40 |
41 | {+subtemplate("subtemplates/foot.tmpl")+} -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/css/fonts/mplus-1m-bold-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-dist/codeview/css/fonts/mplus-1m-bold-webfont.eot -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/css/fonts/mplus-1m-bold-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-dist/codeview/css/fonts/mplus-1m-bold-webfont.ttf -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/css/fonts/mplus-1m-bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-dist/codeview/css/fonts/mplus-1m-bold-webfont.woff -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/css/fonts/mplus-1m-regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-dist/codeview/css/fonts/mplus-1m-regular-webfont.eot -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/css/fonts/mplus-1m-regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-dist/codeview/css/fonts/mplus-1m-regular-webfont.ttf -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/css/fonts/mplus-1m-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-dist/codeview/css/fonts/mplus-1m-regular-webfont.woff -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/css/handheld.css: -------------------------------------------------------------------------------- 1 | /* 2 | * TABLE OF CONTENTS: 3 | * - Browser reset 4 | * - HTML elements 5 | * - JsDoc styling 6 | * - Media query check 7 | */ 8 | 9 | 10 | 11 | 12 | 13 | 14 | /* 15 | * HTML ELEMENTS 16 | */ 17 | 18 | body { 19 | padding: 1% 4% 1% 4%; 20 | } 21 | 22 | /* 23 | * HTML ELEMENTS 24 | */ 25 | 26 | 27 | 28 | 29 | 30 | /* 31 | * BEGIN JSDOC 32 | */ 33 | 34 | /* Start menu */ 35 | div.index div.menu { 36 | position: fixed; 37 | top: 0; 38 | right: 0; 39 | -moz-border-radius-bottomleft: 15px; 40 | -webkit-border-bottom-left-radius: 15px; 41 | -border-bottom-left-radius: 15px; 42 | padding: 4px 5px 8px 10px; 43 | -moz-box-shadow: 0px 0px 10px #c4c4c4; 44 | -webkit-box-shadow: 0px 0px 10px #c4c4c4; 45 | box-shadow: 0px 0px 10px #c4c4c4; 46 | background-color: rgba(255, 255, 255, 0.9); 47 | } 48 | 49 | div.index input.classFilter { 50 | display: none; 51 | } 52 | 53 | div.index div.indexLinks a { 54 | float: right; 55 | clear: both; 56 | font-size: 1.1em; 57 | } 58 | 59 | div.index *.heading1 { 60 | display:none; 61 | } 62 | 63 | div.index ul.classList { 64 | display:none; 65 | } 66 | 67 | div.index div.fineprint { 68 | display:none; 69 | } 70 | 71 | div.indexStatic { 72 | display: none; 73 | } 74 | /* End menu */ 75 | 76 | 77 | 78 | /* Start content */ 79 | div.content *.classTitle { 80 | margin-right: 60px; 81 | margin-bottom: 15px; 82 | } 83 | 84 | div.content div.intro { 85 | margin: 15px 0 35px; 86 | } 87 | 88 | div.content p.description.summary { 89 | margin-bottom: 0.2em; 90 | } 91 | 92 | div.content div.props { 93 | margin: 1.5em -2% 0 -2%; 94 | padding: 2%; 95 | } 96 | 97 | table.summaryTable { 98 | position: relative; 99 | left: -10px; 100 | width: 100%; 101 | border-collapse: collapse; 102 | box-sizing: content-box; 103 | -moz-box-sizing: content-box; 104 | -webkit-box-sizing: content-box; 105 | -ms-box-sizing: content-box; 106 | -o-box-sizing: content-box; 107 | -icab-box-sizing: content-box; 108 | -khtml-box-sizing: content-box; 109 | } 110 | 111 | *.sectionTitle { 112 | padding: 0 10px 10px 0; 113 | } 114 | caption.sectionTitle { 115 | padding-left: 10px; 116 | } 117 | 118 | table.summaryTable td, 119 | table.summaryTable th { 120 | padding: 0px 10px 10px 10px; 121 | } 122 | table.summaryTable tr:last-child td { 123 | padding-bottom: 0; 124 | } 125 | 126 | table.summaryTable td.attributes { 127 | width: 35%; 128 | } 129 | 130 | table.summaryTable td.nameDescription { 131 | width: 65% 132 | } 133 | 134 | 135 | 136 | dl.detailList { 137 | margin-top: 0.5em; 138 | } 139 | 140 | dl.detailList.nomargin + dl.detailList.nomargin { 141 | margin-top: 0; 142 | } 143 | 144 | dl.detailList dt { 145 | display: inline; 146 | margin-right: 5px; 147 | } 148 | 149 | dl.detailList dt:before { 150 | display: block; 151 | content: ""; 152 | } 153 | 154 | dl.detailList dd { 155 | display: inline; 156 | } 157 | 158 | dl.detailList.params dt { 159 | display: block; 160 | } 161 | dl.detailList.params dd { 162 | display: block; 163 | padding-left: 2em; 164 | padding-bottom: 0.4em; 165 | } 166 | 167 | 168 | 169 | 170 | ul.fileList li { 171 | margin-bottom: 1.5em; 172 | } 173 | 174 | 175 | 176 | .fixedFont.heading { 177 | margin-bottom: 0.5em; 178 | } 179 | 180 | pre.code { 181 | margin: 10px 0 10px 0; 182 | padding: 10px; 183 | border: 1px solid #ccc; 184 | -moz-border-radius: 2px; 185 | -webkit-border-radius: 2px; 186 | border-radius: 2px; 187 | } 188 | /* End content */ 189 | 190 | /* 191 | * END JSDOC 192 | */ 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | /* 201 | * START MEDIA QUERY CHECK 202 | */ 203 | 204 | .cssLoadCheck { 205 | position: absolute; 206 | top: -99999px; 207 | left: -99999px; 208 | border: 0; 209 | width: 100px; 210 | padding: 0; 211 | overflow: hidden; 212 | } 213 | 214 | /* 215 | * END MEDIA QUERY CHECK 216 | */ 217 | 218 | -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/javascript/html5.js: -------------------------------------------------------------------------------- 1 | // html5shiv MIT @rem remysharp.com/html5-enabling-script 2 | // iepp v1.6.2 MIT @jon_neal iecss.com/print-protector 3 | /*@cc_on(function(m,c){var z="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video";function n(d){for(var a=-1;++ai";if(g.childNodes.length!==1){var i=z.split("|"),o=i.length,s=RegExp("(^|\\s)("+z+")", 4 | "gi"),t=RegExp("<(/*)("+z+")","gi"),u=RegExp("(^|[^\\n]*?\\s)("+z+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),r=c.createDocumentFragment(),k=c.documentElement;g=k.firstChild;var h=c.createElement("body"),l=c.createElement("style"),f;n(c);n(r);g.insertBefore(l, 5 | g.firstChild);l.media="print";m.attachEvent("onbeforeprint",function(){var d=-1,a=p(c.styleSheets,"all"),e=[],b;for(f=f||c.body;(b=u.exec(a))!=null;)e.push((b[1]+b[2]+b[3]).replace(s,"$1.iepp_$2")+b[4]);for(l.styleSheet.cssText=e.join("\n");++d 2 | wbos.CssTools.MediaQueryFallBack.LoadCss('{+Link.base+}css/screen.css', '{+Link.base+}css/handheld.css', 660) 3 | codeview.classFilter.Init() 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/subtemplates/head.tmpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {+data.subtitle+} | <if test="JSDOC.opt.D.title">{+JSDOC.opt.D.title+}<else />JsDoc Reference</if> 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /redquerybuilder-dist/codeview/subtemplates/menu.tmpl: -------------------------------------------------------------------------------- 1 |
2 | 23 |
24 |
25 | ©{+JSDOC.opt.D.copyright+}
26 | Documentation generator: JsDoc Toolkit {+JSDOC.VERSION+}
27 | Template: {+publish.conf.templateName+} {+publish.conf.templateVersion+}
28 | Generated on: 29 | {! 30 | var date = new Date(); 31 | var minutes = date.getMinutes() +""; 32 | if (minutes.length == 1) { 33 | minutes = '0'+ minutes; 34 | } 35 | var timeHuman = date.getFullYear() + "-" + date.getMonth() + "-" + date.getDate() + " " + date.getHours() + ":" + minutes; 36 | var timeData = date.getFullYear() + "-" + date.getMonth() + "-" + date.getDate(); 37 | output += ""; 38 | !} 39 |
40 |
41 |
42 | 43 |
44 | -------------------------------------------------------------------------------- /redquerybuilder-dist/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | com.redspr 5 | redquerybuilder-parent 6 | 0.8.0 7 | ../redquerybuilder-parent 8 | 9 | redquerybuilder-dist 10 | 11 | 12 | 13 | 14 | com.redspr 15 | redquerybuilder-js 16 | ${project.version} 17 | war 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | maven-assembly-plugin 27 | 2.3 28 | 29 | 30 | 31 | 32 | src/main/assembly/src.xml 33 | 34 | redQueryBuilderJs-${project.version} 35 | 36 | 37 | dist-assembly 38 | package 39 | 40 | single 41 | 42 | 43 | 44 | 45 | 46 | org.apache.maven.plugins 47 | maven-site-plugin 48 | 3.3 49 | 50 | 51 | 52 | org.apache.maven.plugins 53 | maven-project-info-reports-plugin 54 | 2.4 55 | 56 | 57 | index 58 | dependencies 59 | 60 | 61 | 62 | 63 | 64 | org.apache.maven.plugins 65 | maven-changes-plugin 66 | 2.7.1 67 | 68 | 69 | changes-report 70 | 71 | 72 | 73 | 74 | nl.windgazer 75 | jsdoctk-plugin 76 | 2.3.2 77 | 78 | 79 | ${basedir}/../redquerybuilder-js/src/main/webapp 80 | 3 81 | ${project.build.directory}/site/jsdoc 82 | 83 | 84 | 85 | 86 | 87 | 88 | attach-site 89 | prepare-package 90 | 91 | jar 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | jsdoctk2 102 | http://jsdoctk-plugin.googlecode.com/svn/repo 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /redquerybuilder-dist/src/main/assembly/src.xml: -------------------------------------------------------------------------------- 1 | 5 | js 6 | 7 | zip 8 | 9 | false 10 | 11 | 12 | true 13 | 14 | 15 | WEB-INF/** 16 | META-INF/** 17 | 18 | 19 | 20 | 21 | 22 | com.redspr:redquerybuilder-js 23 | 24 | 25 | 26 | 27 | 28 | 29 | ${project.basedir} 30 | / 31 | 32 | README* 33 | LICENSE* 34 | NOTICE* 35 | 36 | 37 | 38 | ${project.build.directory}/site 39 | docs 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /redquerybuilder-dist/src/site/fml/general.fml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | General 10 | 11 | 12 | 13 | What is RedQueryBuilder? 14 | 15 | 16 | RedQueryBuilder fills the gap between a hand coded "quick search" and a full blown query language. A typical use is in an intranet web application where experienced users need a quick ad-hoc way to find particular data. This means they don't have to use report frameworks or ask a techie. 17 | 18 | 19 | 20 | 21 | 22 | What licence covers RedQueryBuilder? 23 | 24 | 25 | Currently it is freeware. We hope to resolve a couple of issues then release source 26 | under a licence like LGPL. However there is currently no deadline for this change. 27 | 28 | 29 | 30 | 31 | 32 | Where do I get the meta data from? 33 | 34 | 35 | You can either generate the meta data from your database meta data 36 | (this is what the appengine demo does) or create it by hand. 37 | Either way you can produce JSON or use the Configuration.nocache.js JavaScript 38 | code to create the correct objects. 39 | 40 | 41 | 42 | 43 | 44 | I only want the users to search one table. How do I remove the From selector. 45 | 46 | 47 | The primary API to RQB is SQL so you could use RedQueryBuilderFactory to set the 48 | initial SQL to select the correct table and optionally setup a starting 49 | point expression. 50 | If you then want to hide the selector you can either use CSS to hide to hide 51 | the element with the class name "rqbFrom" or set visible to false 52 | in the From configuration. 53 | 54 | 55 | 56 | 57 | 58 | I only want the SQL after the WHERE clause. Is there an option to do this? 59 | 60 | 61 | In general it best to use a tool designed to manipulate SQL (i.e. Parser to generate parse tree). 62 | However RQB will always generate a "\n" before a keyword. 63 | So the WHERE clause can be found by searching for "\nWHERE ". 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /redquerybuilder-dist/src/site/site.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /redquerybuilder-dist/src/site/xhtml/index.xhtml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | RedQueryBuilder 6 | 7 | 8 |

Quick start

9 |

10 | RedQueryBuilder has a large range of configuration options but only requires a few steps to get up and running. 11 |

12 |

Link to the JavaScript and CSS files

13 |

14 | Copy the "RedQueryBuilder" directory to your project and add the following to your HTML page: 15 |

16 | 17 |
18 |
19 | //
21 |     
22 |     
23 | ]]>
24 | 
25 |
26 | 27 |

Startup RedQueryBuilder

28 |

29 | To check that everything is working properly provide the default location for the widget to appear 30 | by inserting this bit of HTML: 31 |

32 | 33 |
34 |
35 |  
37 | ]]> 38 | 39 | 40 | 41 |

42 | Then execute this JavaScript: 43 |

44 | 45 |
46 |
47 | 
71 | 
72 |
73 | 74 |

Next steps

75 |

76 | The JavaScript API documentation describes how to provide more meta data and how to get the widget to call your code when changes happen. 77 |

78 | 79 | 80 | -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/java/com/redspr/redquerybuilder/sample/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.sample; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/resources/meta.properties: -------------------------------------------------------------------------------- 1 | fk.CITY_IBFK_1=City 2 | fk.CITY_IBFK_1.reverse=Country 3 | fk.COUNTRYLANGUAGE_IBFK_1=Language 4 | fk.COUNTRYLANGUAGE_IBFK_1.reverse=Country 5 | -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/resources/simple1.sql: -------------------------------------------------------------------------------- 1 | 2 | CREATE TABLE People 3 | ( 4 | "id" int, 5 | LastName varchar(40), 6 | FirstName varchar(40), 7 | Address varchar(60), 8 | City varchar(50) 9 | ); 10 | 11 | INSERT INTO People ("id", LastName, FirstName, Address, City) 12 | VALUES (123, 'Smith', 'John', 'House', 'Wigan'); 13 | INSERT INTO People ("id", LastName, FirstName, Address, City) 14 | VALUES (124, 'Smith', 'Jane', 'House', 'Wigan'); -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/resources/world.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/resources/world.sql -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/WEB-INF/appengine-web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | redquerybuilder 4 | override 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | true 21 | 22 | -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | Archetype Created Web Application 7 | 8 | 9 | search 10 | com.redspr.redquerybuilder.sample.SearchServlet 11 | 1 12 | 13 | 14 | 15 | search 16 | /search 17 | 18 | 19 | 20 | meta 21 | com.redspr.redquerybuilder.sample.MetaServlet 22 | 23 | 24 | 25 | meta 26 | /meta 27 | 28 | 29 | -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/bg.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/btn-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/btn-sprite.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/ddn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/ddn.png -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/dn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/dn.png -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/fhbg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/fhbg.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/first.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/first.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/hl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/hl.png -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/last.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/last.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/line.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/line.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/load.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/load.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/load.png -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/magnifier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/magnifier.png -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/next.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/next.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/prev.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/prev.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/up.png -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/uup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/uup.png -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/wbg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/flexigrid/css/images/wbg.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/jgrowl/jquery.jgrowl.css: -------------------------------------------------------------------------------- 1 | 2 | div.jGrowl { 3 | padding: 10px; 4 | z-index: 9999; 5 | color: #fff; 6 | font-size: 12px; 7 | } 8 | 9 | /** Special IE6 Style Positioning **/ 10 | div.ie6 { 11 | position: absolute; 12 | } 13 | 14 | div.ie6.top-right { 15 | right: auto; 16 | bottom: auto; 17 | left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); 18 | top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); 19 | } 20 | 21 | div.ie6.top-left { 22 | left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); 23 | top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); 24 | } 25 | 26 | div.ie6.bottom-right { 27 | left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); 28 | top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); 29 | } 30 | 31 | div.ie6.bottom-left { 32 | left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); 33 | top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); 34 | } 35 | 36 | div.ie6.center { 37 | left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); 38 | top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); 39 | width: 100%; 40 | } 41 | 42 | /** Normal Style Positions **/ 43 | div.jGrowl { 44 | position: absolute; 45 | } 46 | 47 | body > div.jGrowl { 48 | position: fixed; 49 | } 50 | 51 | div.jGrowl.top-left { 52 | left: 0px; 53 | top: 0px; 54 | } 55 | 56 | div.jGrowl.top-right { 57 | right: 0px; 58 | top: 0px; 59 | } 60 | 61 | div.jGrowl.bottom-left { 62 | left: 0px; 63 | bottom: 0px; 64 | } 65 | 66 | div.jGrowl.bottom-right { 67 | right: 0px; 68 | bottom: 0px; 69 | } 70 | 71 | div.jGrowl.center { 72 | top: 0px; 73 | width: 50%; 74 | left: 25%; 75 | } 76 | 77 | /** Cross Browser Styling **/ 78 | div.center div.jGrowl-notification, div.center div.jGrowl-closer { 79 | margin-left: auto; 80 | margin-right: auto; 81 | } 82 | 83 | div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer { 84 | background-color: #000; 85 | opacity: .85; 86 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; 87 | filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85); 88 | zoom: 1; 89 | width: 235px; 90 | padding: 10px; 91 | margin-top: 5px; 92 | margin-bottom: 5px; 93 | font-family: Tahoma, Arial, Helvetica, sans-serif; 94 | font-size: 1em; 95 | text-align: left; 96 | display: none; 97 | -moz-border-radius: 5px; 98 | -webkit-border-radius: 5px; 99 | } 100 | 101 | div.jGrowl div.jGrowl-notification { 102 | min-height: 40px; 103 | } 104 | 105 | div.jGrowl div.jGrowl-notification div.jGrowl-header { 106 | font-weight: bold; 107 | font-size: .85em; 108 | } 109 | 110 | div.jGrowl div.jGrowl-notification div.jGrowl-close { 111 | z-index: 99; 112 | float: right; 113 | font-weight: bold; 114 | font-size: 1em; 115 | cursor: pointer; 116 | } 117 | 118 | div.jGrowl div.jGrowl-closer { 119 | padding-top: 4px; 120 | padding-bottom: 4px; 121 | cursor: pointer; 122 | font-size: .9em; 123 | font-weight: bold; 124 | text-align: center; 125 | } 126 | 127 | /** Hide jGrowl when printing **/ 128 | @media print { 129 | div.jGrowl { 130 | display: none; 131 | } 132 | } -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/static/busy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-jdbcsample/src/main/webapp/static/busy.gif -------------------------------------------------------------------------------- /redquerybuilder-jdbcsample/src/main/webapp/static/site.css: -------------------------------------------------------------------------------- 1 | #container 2 | { 3 | margin: 0 auto; 4 | width: 100%; 5 | } 6 | 7 | #header 8 | { 9 | padding: 20px; 10 | } 11 | 12 | #header h1 { margin: 0; } 13 | 14 | #navigation 15 | { 16 | float: left; 17 | width: 100%; 18 | } 19 | 20 | #navigation ul 21 | { 22 | margin: 0; 23 | padding: 0; 24 | } 25 | 26 | #navigation ul li 27 | { 28 | list-style-type: none; 29 | display: inline; 30 | } 31 | 32 | #navigation li a 33 | { 34 | display: block; 35 | float: left; 36 | padding: 5px 10px; 37 | text-decoration: none; 38 | border-right: 1px solid #fff; 39 | } 40 | 41 | #navigation li a:hover { background: #383; } 42 | 43 | #content-container 44 | { 45 | float: left; 46 | width: 100%; 47 | } 48 | 49 | #content 50 | { 51 | clear: left; 52 | float: left; 53 | width: 60%; 54 | padding: 20px 0; 55 | margin: 0 0 0 4%; 56 | display: inline; 57 | } 58 | 59 | #content h2 { margin: 0; } 60 | 61 | #aside 62 | { 63 | float: right; 64 | width: 26%; 65 | padding: 20px 0; 66 | margin: 0 3% 0 0; 67 | display: inline; 68 | } 69 | 70 | #aside h3 { margin: 0; } 71 | 72 | #footer 73 | { 74 | clear: left; 75 | background: #ccc; 76 | text-align: right; 77 | padding: 20px; 78 | height: 1%; 79 | } 80 | 81 | 82 | 83 | 84 | body, table td, select { 85 | font-family: Arial Unicode MS, Arial, sans-serif; 86 | font-size: small; 87 | color: #bec7cc; 88 | } 89 | select { 90 | color: #000; 91 | } 92 | pre { 93 | font-family: "courier new", courier; 94 | font-size: small; 95 | } 96 | body { 97 | margin: 0px; 98 | border: 0px; 99 | padding: 0px; 100 | background: #4d4d4d; 101 | direction: ltr; 102 | } 103 | a, a:visited, a:hover { 104 | color: #ccf; 105 | } -------------------------------------------------------------------------------- /redquerybuilder-js/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | com.redspr 5 | redquerybuilder-parent 6 | 0.8.0 7 | ../redquerybuilder-parent/pom.xml 8 | 9 | redquerybuilder-js 10 | war 11 | 12 | 13 | 14 | 15 | 16 | org.codehaus.mojo 17 | gwt-maven-plugin 18 | 19 | 20 | 21 | com.redspr.redquerybuilder.js.RedQueryBuilder 22 | htmlunit 23 | true 24 | 120 25 | JS 26 | 27 | 28 | compile 29 | test 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | org.apache.maven.plugins 38 | maven-war-plugin 39 | 2.0.2 40 | 41 | **/*.class 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | com.redspr 52 | redquerybuilder-core 53 | ${project.version} 54 | 55 | 56 | 57 | com.google.gwt 58 | gwt-user 59 | provided 60 | 61 | 62 | junit 63 | junit 64 | 65 | 66 | com.google.gwt 67 | gwt-dev 68 | provided 69 | 70 | 71 | 72 | 73 | 74 | quick 75 | 76 | true 77 | true 78 | 1 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/RedQueryBuilder.gwt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsCallback.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2010-2013 Redspr Ltd. 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the Eclipse Public License v1.0 5 | * which accompanies this distribution, and is available at 6 | * http://www.eclipse.org/legal/epl-v10.html 7 | * 8 | * Contributors: 9 | * Sam Hough - initial API and implementation 10 | *******************************************************************************/ 11 | package com.redspr.redquerybuilder.js.client; 12 | 13 | import com.google.gwt.core.client.JavaScriptObject; 14 | 15 | public interface JsCallback { 16 | void response(JavaScriptObject o); 17 | } 18 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsColumn.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | 5 | public class JsColumn extends JavaScriptObject { 6 | protected JsColumn() { 7 | } 8 | 9 | public final native String getName() /*-{ return this.name; }-*/; 10 | 11 | public final native String getLabel() /*-{ return this.label; }-*/; 12 | 13 | public final native String getType() /*-{ return this.type; }-*/; 14 | 15 | public final native String getEditor() /*-{ return this.editor; }-*/; 16 | 17 | public final native String getStyleName() /*-{ return this['class']; }-*/; 18 | } 19 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | import com.google.gwt.core.client.JsArray; 5 | import com.google.gwt.core.client.JsArrayMixed; 6 | import com.redspr.redquerybuilder.core.client.table.TableFilter; 7 | import com.redspr.redquerybuilder.core.client.util.ObjectArray; 8 | import com.redspr.redquerybuilder.js.client.conf.JsFrom; 9 | 10 | /** 11 | * Root of JS configuration tree. 12 | */ 13 | public class JsConfiguration extends JavaScriptObject { 14 | protected JsConfiguration() { 15 | } 16 | 17 | public final native String getTargetId2() /*-{ return this.targetId; }-*/; 18 | 19 | public final String getTargetId() { 20 | String id = getTargetId2(); 21 | if (id == null) { 22 | return "rqb"; 23 | } 24 | return id; 25 | } 26 | 27 | public final native JsDatabase getMeta() /*-{ return this.meta; }-*/; 28 | 29 | public final native JsArray getEditors() /*-{ 30 | return this.editors; 31 | }-*/; 32 | 33 | public final native JavaScriptObject getOnSuggest() /*-{ 34 | return this.suggest 35 | }-*/; 36 | 37 | public final void fireOnTableChange(ObjectArray filters) { 38 | JsArray result = (JsArray) JavaScriptObject.createArray(); 39 | for (int i = 0; i < filters.size(); i++) { 40 | TableFilter tf = filters.get(i); 41 | JsTableFilter jtf = JsTableFilter.create(tf.getAlias(), tf.getTable().getName()); 42 | result.push(jtf); 43 | } 44 | fireOnTableChange2(result); 45 | } 46 | 47 | 48 | 49 | private native JavaScriptObject fireOnTableChange2(JsArray filters) /*-{ 50 | if (this.onTableChange) { 51 | this.onTableChange(filters); 52 | } 53 | }-*/; 54 | 55 | public final native void fireOnSqlChange(String sql, JsArrayMixed args) /*-{ 56 | if (this.onSqlChange) { 57 | this.onSqlChange(sql, args); 58 | } 59 | }-*/; 60 | 61 | // XXX copy n paste 62 | public final native void fireDefaultSuggest(String tableName, String columnName, String columnTypeName, String query, 63 | int limit, JsCallback jsCallback) /*-{ 64 | if (this.defaultSuggest) { 65 | var arg = {tableName: tableName, 66 | columnName: columnName, 67 | columnTypeName : columnTypeName, 68 | query: query, 69 | limit:limit}; 70 | this.defaultSuggest(arg, function response(s) { 71 | jsCallback.@com.redspr.redquerybuilder.js.client.JsCallback::response(Lcom/google/gwt/core/client/JavaScriptObject;)(s); 72 | }); 73 | } 74 | }-*/; 75 | 76 | public final native void fireSuggest(String tableName, String columnName, String columnTypeName, String query, 77 | int limit, JsCallback jsCallback) /*-{ 78 | var arg = {tableName: tableName, 79 | columnName: columnName, 80 | columnTypeName : columnTypeName, 81 | query: query, 82 | limit:limit}; 83 | this.suggest(arg, function response(s) { 84 | jsCallback.@com.redspr.redquerybuilder.js.client.JsCallback::response(Lcom/google/gwt/core/client/JavaScriptObject;)(s); 85 | }); 86 | }-*/; 87 | 88 | public final native void fireEnumerate(String tableName, String columnName, String columnTypeName, 89 | JsCallback jsCallback) /*-{ 90 | if (this.enumerate) { 91 | var arg = {tableName: tableName, 92 | columnName: columnName, 93 | columnTypeName : columnTypeName}; 94 | this.enumerate(arg, function response(s) { 95 | jsCallback.@com.redspr.redquerybuilder.js.client.JsCallback::response(Lcom/google/gwt/core/client/JavaScriptObject;)(s); 96 | }); 97 | } 98 | }-*/; 99 | 100 | public final native JsFrom getFrom() /*-{ 101 | return this.from; 102 | }-*/; 103 | } 104 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsDatabase.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | import com.google.gwt.core.client.JsArray; 5 | 6 | public class JsDatabase extends JavaScriptObject { 7 | protected JsDatabase() { 8 | } 9 | 10 | public final native JsArray getTables() /*-{ return this.tables || []; }-*/; 11 | 12 | public final native JsArray getTypes() /*-{ return this.types || []; }-*/; 13 | } 14 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsEditor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | 5 | public class JsEditor extends JavaScriptObject { 6 | protected JsEditor() { 7 | } 8 | 9 | public final native String getName() /*-{ return this.name; }-*/; 10 | 11 | public final native String getFormat() /*-{ return this.format; }-*/; 12 | 13 | public final native String getStyleName() /*-{ return this['class']; }-*/; 14 | } 15 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsFk.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | import com.redspr.redquerybuilder.core.client.util.JsStringArray; 5 | 6 | public class JsFk extends JavaScriptObject { 7 | protected JsFk() { 8 | } 9 | 10 | public final native String getName() /*-{ return this.name; }-*/; 11 | public final native String getLabel() /*-{ return this.label; }-*/; 12 | public final native String getReverseLabel() /*-{ return this.reverseLabel; }-*/; 13 | 14 | public final native JsStringArray getForeignKeyNames() /*-{ 15 | return this.foreignKeyNames || this.pkColumnNames; 16 | }-*/; 17 | 18 | public final native String getReferencedTableName() /*-{ 19 | return this.referencedTableName || this.fkTableName; 20 | }-*/; 21 | 22 | public final native JsStringArray getReferencedKeyNames() /*-{ 23 | return this.referencedKeyNames || this.fkColumnNames; 24 | }-*/; 25 | } 26 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsList.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | import com.google.gwt.core.client.JavaScriptObject; 8 | import com.google.gwt.core.client.JsArrayMixed; 9 | import com.google.gwt.core.client.JsDate; 10 | 11 | public final class JsList extends JavaScriptObject { 12 | 13 | private static final JsList INSTANCE = (JsList) JavaScriptObject.createObject(); 14 | 15 | public static JsList get() { 16 | return INSTANCE; 17 | } 18 | 19 | protected JsList() { 20 | } 21 | 22 | public native boolean isNull(JavaScriptObject array, int i) /*-{ 23 | return array[i] == null; 24 | }-*/; 25 | 26 | public native boolean isDate(JavaScriptObject array, int i) /*-{ 27 | return Boolean(array[i].getMonth); 28 | }-*/; 29 | 30 | public Date getDate(JavaScriptObject array, int i) { 31 | JsDate jsDate = getJsDate(array, i); 32 | 33 | return new Date((long) jsDate.getTime()); 34 | } 35 | 36 | private native JsDate getJsDate(JavaScriptObject array, int i) /*-{ 37 | return array[i]; 38 | }-*/; 39 | 40 | public native boolean isString(JavaScriptObject array, int i) /*-{ 41 | return (typeof array[i] == 'string' || array[i] instanceof String); 42 | }-*/; 43 | 44 | public native boolean isNumber(JavaScriptObject array, int i) /*-{ 45 | return (typeof array[i] == 'number' || array[i] instanceof Number); 46 | }-*/; 47 | 48 | public native String debugString(JavaScriptObject array, int i) /*-{ 49 | return 'typeof=' + typeof array[i] + ' toString="' + array[i] + '"'; 50 | }-*/; 51 | 52 | public JsArrayMixed toJso(List args) { 53 | JsArrayMixed result = (JsArrayMixed) JavaScriptObject.createArray(); 54 | for (Object o : args) { 55 | if (o == null) { 56 | result.push((JavaScriptObject) null); 57 | } else if (o instanceof String) { 58 | result.push((String) o); 59 | } else if (o instanceof Date) { 60 | result.push(JsDate.create(((Date) o).getTime())); 61 | } else if (o instanceof Double) { 62 | result.push(((Double) o).doubleValue()); 63 | } else { 64 | throw new IllegalArgumentException("Don't know how to handle " 65 | + o); 66 | } 67 | } 68 | return result; 69 | } 70 | 71 | private Object get(JsArrayMixed args, int i) { 72 | if (isNull(args, i)) { 73 | return i; 74 | } else if (isDate(args, i)) { 75 | return getDate(args, i); 76 | } else if (isString(args, i)) { 77 | return args.getString(i); 78 | } else if (isNumber(args, i)) { 79 | return args.getNumber(i); 80 | } 81 | 82 | throw new RuntimeException("Unable to handle value " + debugString(args, i)); 83 | } 84 | 85 | public List toList(JsArrayMixed args) { 86 | List result = new ArrayList(); 87 | if (args != null) { 88 | for (int i = 0; i < args.length(); i++) { 89 | result.add(get(args, i)); 90 | } 91 | } 92 | return result; 93 | } 94 | } 95 | 96 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsMessage.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.js.JsExport; 4 | import com.redspr.redquerybuilder.core.client.Message; 5 | 6 | 7 | public class JsMessage implements Message { 8 | private String text; 9 | 10 | @JsExport("$wnd.rqb.Message") 11 | public JsMessage(String text) { 12 | this.text = text; 13 | } 14 | 15 | @Override 16 | public String getText() { 17 | return text; 18 | } 19 | 20 | public void setText(String text) { 21 | this.text = text; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsOperator.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | 5 | public class JsOperator extends JavaScriptObject { 6 | protected JsOperator() { 7 | } 8 | 9 | public final native String getName() /*-{ return this.name; }-*/; 10 | 11 | public final native String getLabel() /*-{ return this.label; }-*/; 12 | 13 | public final native String getCardinality() /*-{ return this.cardinality; }-*/; 14 | } 15 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsSuggestion.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | 5 | public class JsSuggestion extends JavaScriptObject { 6 | protected JsSuggestion() { 7 | } 8 | 9 | // TODO 00 work for null value? document 10 | public final native String getValue() /*-{ 11 | if (this.value) { 12 | return this.value; 13 | } 14 | return this; 15 | }-*/; 16 | 17 | public final native String getLabel() /*-{ 18 | if (this.label) { 19 | return this.label; 20 | } 21 | return this; 22 | }-*/; 23 | } 24 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsTable.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | import com.google.gwt.core.client.JsArray; 5 | 6 | public class JsTable extends JavaScriptObject { 7 | protected JsTable() { 8 | } 9 | 10 | public final native String getName() /*-{ return this.name; }-*/; 11 | 12 | public final native String getLabel() /*-{ return this.label; }-*/; 13 | 14 | public final native JsArray getColumns() /*-{ return this.columns || []; }-*/; 15 | 16 | public final native JsArray getFks() /*-{ return this.fks || []; }-*/; 17 | } 18 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsTableFilter.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | 5 | public class JsTableFilter extends JavaScriptObject { 6 | protected JsTableFilter() { 7 | } 8 | 9 | public final native String getAlias() /*-{ return this.alias; }-*/; 10 | 11 | public final native String getTableName() /*-{ return this.tableName; }-*/; 12 | 13 | public static final native JsTableFilter create(String alias, String tableName) /*-{ 14 | return {alias: alias, tableName: tableName}; 15 | }-*/; 16 | } 17 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsType.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | import com.google.gwt.core.client.JsArray; 5 | 6 | public class JsType extends JavaScriptObject { 7 | protected JsType() { 8 | } 9 | 10 | public final native String getName() /*-{ return this.name; }-*/; 11 | 12 | public final native String getEditor() /*-{ return this.editor; }-*/; 13 | 14 | public final native JsArray getOperators() /*-{ return this.operators; }-*/; 15 | 16 | public final native String getStyleName() /*-{ return this['class']; }-*/; 17 | } 18 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/JsVisitor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.js.JsExport; 4 | import com.redspr.redquerybuilder.core.client.BaseSqlWidget; 5 | import com.redspr.redquerybuilder.core.client.Visitor; 6 | import com.redspr.redquerybuilder.core.client.VisitorContext; 7 | 8 | // XXX move into core as DefaultVisitor? 9 | //@JsNamespace("$wnd.rqb") 10 | @com.google.gwt.core.client.js.JsType 11 | public class JsVisitor implements Visitor { 12 | 13 | @JsExport("$wnd.rqb.Visitor") 14 | public JsVisitor() { 15 | 16 | } 17 | 18 | @Override 19 | public void handle(BaseSqlWidget w) { 20 | } 21 | 22 | @Override 23 | public void visit(VisitorContext context) { 24 | } 25 | 26 | @Override 27 | public void endVisit(VisitorContext context) { 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/RedQueryBuilder.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.google.gwt.core.client.EntryPoint; 7 | import com.google.gwt.core.client.JsArrayMixed; 8 | import com.google.gwt.core.client.js.JsExport; 9 | import com.google.gwt.core.client.js.JsNamespace; 10 | import com.google.gwt.event.logical.shared.ValueChangeEvent; 11 | import com.google.gwt.event.logical.shared.ValueChangeHandler; 12 | import com.google.gwt.user.client.ui.RootPanel; 13 | import com.google.gwt.user.client.ui.SimplePanel; 14 | import com.redspr.redquerybuilder.core.client.Configuration; 15 | import com.redspr.redquerybuilder.core.client.command.CommandBuilder; 16 | import com.redspr.redquerybuilder.core.client.command.dml.Select; 17 | import com.redspr.redquerybuilder.core.client.engine.Session; 18 | import com.redspr.redquerybuilder.core.client.engine.TableEvent; 19 | import com.redspr.redquerybuilder.core.client.engine.TableEventHandler; 20 | import com.redspr.redquerybuilder.core.client.expression.ExpressionColumn; 21 | import com.redspr.redquerybuilder.core.client.table.TableFilter; 22 | import com.redspr.redquerybuilder.core.client.util.ObjectArray; 23 | import com.redspr.redquerybuilder.core.shared.meta.Column; 24 | 25 | /** 26 | * Bootstraps the JS version. 27 | * 28 | * NB methods in order or lifecycle rather than normal rules. 29 | */ 30 | @JsNamespace("$wnd.rqb") 31 | @com.google.gwt.core.client.js.JsType 32 | public class RedQueryBuilder implements EntryPoint { 33 | 34 | private final SimplePanel builderContainer = new SimplePanel(); 35 | 36 | 37 | @Override 38 | public void onModuleLoad() { 39 | 40 | } 41 | 42 | // TODO 00 unit test, null args 43 | @JsExport("$wnd.redQueryBuilder") 44 | static CommandBuilder configure(JsConfiguration config, String sql, 45 | JsArrayMixed args) throws Exception { 46 | if (config == null) { 47 | throw new IllegalArgumentException("Config is null."); 48 | } 49 | 50 | RedQueryBuilder rqb = new RedQueryBuilder(); 51 | 52 | return rqb.install(config, sql, JsList.get().toList(args)); 53 | } 54 | 55 | private CommandBuilder install(JsConfiguration config2, String sql, List args) 56 | throws Exception { 57 | Configuration config = new ConfigurationAdapter(config2); 58 | 59 | RootPanel.get(config2.getTargetId()).add(builderContainer); 60 | return createCommandBuilder(config, sql, args); 61 | } 62 | 63 | private CommandBuilder createCommandBuilder(final Configuration config2, String sql, 64 | List args) throws Exception { 65 | final Session session = new Session(config2); 66 | 67 | final CommandBuilder builder = new CommandBuilder(session, sql, args); 68 | 69 | session.getMsgBus().addHandler(TableEvent.TYPE, 70 | new TableEventHandler() { 71 | @Override 72 | public void onTable(TableEvent e) { 73 | ObjectArray expr; 74 | if (session.getFilters().size() > 0) { 75 | config2.fireOnTableChange(session.getFilters()); 76 | // XXX need to do distinct? 77 | expr = ObjectArray.newInstance(); 78 | TableFilter tf = session.getFilters().get(0); 79 | String alias = tf.getAlias(); 80 | for (Column col : tf.getTable().getColumns()) { 81 | expr.add(new ExpressionColumn(session, null, alias, 82 | col.getName())); 83 | } 84 | } else { 85 | expr = null; 86 | } 87 | builder.getSelect().setExpressions(expr); 88 | } 89 | }); 90 | 91 | builder.addValueChangeHandler(new ValueChangeHandler event) { 94 | List args = new ArrayList(); 95 | String sql = event.getValue().getSQL(args); 96 | 97 | config2.fireOnSqlChange(sql, args); 98 | } 99 | }); 100 | 101 | builderContainer.setWidget(builder); 102 | 103 | config2.fireOnTableChange(session.getFilters()); 104 | 105 | return builder; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/conf/JsFrom.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client.conf; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | 5 | public class JsFrom extends JavaScriptObject { 6 | protected JsFrom() { 7 | } 8 | 9 | public final native boolean isVisible() /*-{ return this.visible; }-*/; 10 | } 11 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/conf/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.js.client.conf; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/java/com/redspr/redquerybuilder/js/client/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.redspr.redquerybuilder.js.client; 5 | 6 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/resources/com/google/gwt/user/client/TakesValue.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2010 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | package com.google.gwt.user.client; 17 | 18 | /** 19 | * Implemented by objects that hold a value. 20 | * 21 | * @param value type 22 | */ 23 | @com.google.gwt.core.client.js.JsType 24 | public interface TakesValue { 25 | /** 26 | * Sets the value. 27 | * 28 | * @param value a value object of type V 29 | * @see #getValue() 30 | */ 31 | void setValue(V value); 32 | 33 | /** 34 | * Returns the current value. 35 | * 36 | * @return the value as an object of type V 37 | * @see #setValue 38 | */ 39 | V getValue(); 40 | } 41 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/RedQueryBuilderFactory.nocache.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A helper class to construct and manage RedQueryBuilder instances. 3 | * 4 | * Use RedQueryBuilderFactory.create rather than the constructor. 5 | * 6 | * @constructor 7 | */ 8 | function RedQueryBuilderFactory(config, sql, args) { 9 | /** 10 | * The description of the database. 11 | * @type Configuration 12 | */ 13 | this.config = config; 14 | 15 | /** 16 | * Initial SQL. 17 | * @type string 18 | */ 19 | this.sql = sql; 20 | 21 | /** 22 | * Initial arguments. 23 | * @type string[] 24 | */ 25 | this.args = args; 26 | } 27 | 28 | RedQueryBuilderFactory.create = function(config, sql, args) { 29 | var x = new RedQueryBuilderFactory(config, sql, args); 30 | x.waitForLoad(); 31 | } 32 | 33 | RedQueryBuilderFactory.prototype.waitForLoad = function() { 34 | var rqb = this; 35 | var fn = function() { 36 | if (!window.redQueryBuilder) { 37 | setTimeout(fn, 50); 38 | } else { 39 | rqb.ready(); 40 | } 41 | } 42 | fn(); 43 | } 44 | 45 | RedQueryBuilderFactory.prototype.ready = function() { 46 | var instance = window.redQueryBuilder(this.config, this.sql, this.args); 47 | if (this.config.onLoad) { 48 | this.config.onLoad(instance); 49 | } 50 | } -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/corner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/corner.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/corner_ie6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/corner_ie6.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/hborder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/hborder.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/hborder_ie6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/hborder_ie6.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/corner_dialog_topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/corner_dialog_topleft.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/corner_dialog_topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/corner_dialog_topright.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/hborder_blue_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/hborder_blue_shadow.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/hborder_gray_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/hborder_gray_shadow.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/vborder_blue_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/vborder_blue_shadow.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/vborder_gray_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/ie6/vborder_gray_shadow.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/splitPanelThumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/splitPanelThumb.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/vborder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/vborder.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/vborder_ie6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/salk31/RedQueryBuilder/0921bb0f008d1a259e39d503e507499792a56224/redquerybuilder-js/src/main/webapp/RedQueryBuilder/gwt/dark/images/vborder_ie6.png -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | Archetype Created Web Application 7 | 8 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | RedQueryBuilderJs 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |

RedQueryBuilder

18 | 19 |

Quick Start

20 |
    21 |
  • This page and the JavaScript file "simple.js" provide a minimal example.
  • 22 |
  • See the reference documentation to understand this page and go further.
  • 23 |
  • There is also a richer live example.
  • 24 |
25 | 26 | 27 | 33 | 34 |

Minimal example

35 | 36 |
37 | 38 |
39 | 40 |

Visitor example

41 | 42 |
43 | 44 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/simple.js: -------------------------------------------------------------------------------- 1 | RedQueryBuilderFactory.create({ 2 | meta : { 3 | tables : [ { 4 | "name" : "PERSON", 5 | "label" : "Person", 6 | "columns" : [ { 7 | "name" : "NAME", 8 | "label" : "Name", 9 | "type" : "STRING", 10 | "size" : 10 11 | }, { 12 | "name" : "DOB", 13 | "label" : "Date of birth", 14 | "type" : "DATE" 15 | }, { 16 | "name" : "SEX", 17 | "label" : "Sex", 18 | "type" : "STRING", 19 | "editor" : "SELECT" 20 | }, { 21 | "name" : "CATEGORY", 22 | "label" : "Category", 23 | "type" : "REF", 24 | } ], 25 | fks : [] 26 | } ], 27 | 28 | types : [ { 29 | "name" : "STRING", 30 | "editor" : "TEXT", 31 | "operators" : [ { 32 | "name" : "=", 33 | "label" : "is", 34 | "cardinality" : "ONE" 35 | }, { 36 | "name" : "<>", 37 | "label" : "is not", 38 | "cardinality" : "ONE" 39 | }, { 40 | "name" : "LIKE", 41 | "label" : "like", 42 | "cardinality" : "ONE" 43 | }, { 44 | "name" : "<", 45 | "label" : "less than", 46 | "cardinality" : "ONE" 47 | }, { 48 | "name" : ">", 49 | "label" : "greater than", 50 | "cardinality" : "ONE" 51 | } ] 52 | }, { 53 | "name" : "DATE", 54 | "editor" : "DATE", 55 | "operators" : [ { 56 | "name" : "=", 57 | "label" : "is", 58 | "cardinality" : "ONE" 59 | }, { 60 | "name" : "<>", 61 | "label" : "is not", 62 | "cardinality" : "ONE" 63 | }, { 64 | "name" : "<", 65 | "label" : "before", 66 | "cardinality" : "ONE" 67 | }, { 68 | "name" : ">", 69 | "label" : "after", 70 | "cardinality" : "ONE" 71 | } ] 72 | }, { 73 | "name" : "REF", 74 | "editor" : "SELECT", 75 | "operators" : [ { 76 | "name" : "IN", 77 | "label" : "any of", 78 | "cardinality" : "MULTI" 79 | }] 80 | } ] 81 | }, 82 | onSqlChange : function(sql, args) { 83 | var out = sql + '\r\n'; 84 | for (var i = 0; i < args.length; i++) { 85 | var arg = args[i]; 86 | out += 'arg' + i; 87 | if (arg != null) { 88 | out += ' type=' + Object.prototype.toString.call(arg) + ' toString=' + arg; 89 | } else { 90 | out += ' null'; 91 | } 92 | out += '\r\n'; 93 | } 94 | document.getElementById("debug").value = out; 95 | }, 96 | enumerate : function(request, response) { 97 | if (request.columnName == 'CATEGORY') { 98 | response([{value:'A', label:'Small'}, {value:'B', label:'Medium'}]); 99 | } else { 100 | response([{value:'M', label:'Male'}, {value:'F', label:'Female'}]); 101 | } 102 | }, 103 | editors : [ { 104 | name : 'DATE', 105 | format : 'dd.MM.yyyy' 106 | } ] 107 | }); -------------------------------------------------------------------------------- /redquerybuilder-js/src/main/webapp/visitor.js: -------------------------------------------------------------------------------- 1 | RedQueryBuilderFactory.create({ 2 | targetId : 'rqbVisitor', 3 | meta : { 4 | tables : [ { 5 | "name" : "PERSON", 6 | "label" : "Person", 7 | "columns" : [ { 8 | "name" : "NAME", 9 | "label" : "Name", 10 | "type" : "STRING", 11 | "size" : 10 12 | }, { 13 | "name" : "DOB", 14 | "label" : "Date of birth", 15 | "type" : "DATE" 16 | }, { 17 | "name" : "SEX", 18 | "label" : "Sex", 19 | "type" : "STRING", 20 | "editor" : "SELECT" 21 | }, { 22 | "name" : "CATEGORY", 23 | "label" : "Category", 24 | "type" : "REF", 25 | } ], 26 | fks : [] 27 | } ], 28 | 29 | types : [ { 30 | "name" : "STRING", 31 | "editor" : "TEXT", 32 | "operators" : [ { 33 | "name" : "=", 34 | "label" : "is", 35 | "cardinality" : "ONE" 36 | }, { 37 | "name" : "<>", 38 | "label" : "is not", 39 | "cardinality" : "ONE" 40 | }, { 41 | "name" : "LIKE", 42 | "label" : "like", 43 | "cardinality" : "ONE" 44 | }, { 45 | "name" : "<", 46 | "label" : "less than", 47 | "cardinality" : "ONE" 48 | }, { 49 | "name" : ">", 50 | "label" : "greater than", 51 | "cardinality" : "ONE" 52 | } ] 53 | }, { 54 | "name" : "DATE", 55 | "editor" : "DATE", 56 | "operators" : [ { 57 | "name" : "=", 58 | "label" : "is", 59 | "cardinality" : "ONE" 60 | }, { 61 | "name" : "<>", 62 | "label" : "is not", 63 | "cardinality" : "ONE" 64 | }, { 65 | "name" : "<", 66 | "label" : "before", 67 | "cardinality" : "ONE" 68 | }, { 69 | "name" : ">", 70 | "label" : "after", 71 | "cardinality" : "ONE" 72 | } ] 73 | }, { 74 | "name" : "REF", 75 | "editor" : "SELECT", 76 | "operators" : [ { 77 | "name" : "IN", 78 | "label" : "any of", 79 | "cardinality" : "MULTI" 80 | }] 81 | } ] 82 | }, 83 | onLoad : function(instance) { 84 | // XXX this really how you get it? 85 | this.instance = instance; 86 | }, 87 | onSqlChange : function(sql, args) { 88 | var visitor = new rqb.Visitor(); 89 | visitor.visit = function(ctx) { 90 | if (ctx.asHasMessages()) { 91 | var msg = new rqb.Message('Hello ' + ctx.asHasValue().getValue()); 92 | ctx.asHasMessages().showMessage(msg); 93 | } 94 | } 95 | this.instance.accept(visitor); 96 | }, 97 | enumerate : function(request, response) { 98 | if (request.columnName == 'CATEGORY') { 99 | response([{value:'A', label:'Small'}, {value:'B', label:'Medium'}]); 100 | } else { 101 | response([{value:'M', label:'Male'}, {value:'F', label:'Female'}]); 102 | } 103 | }, 104 | editors : [ { 105 | name : 'DATE', 106 | format : 'dd.MM.yyyy' 107 | } ] 108 | }); -------------------------------------------------------------------------------- /redquerybuilder-js/src/test/java/com/redspr/redquerybuilder/js/client/AbstractTest.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import org.junit.Ignore; 4 | 5 | import com.google.gwt.core.client.JavaScriptObject; 6 | import com.google.gwt.core.client.JsArrayMixed; 7 | import com.google.gwt.core.client.JsonUtils; 8 | import com.google.gwt.junit.client.GWTTestCase; 9 | import com.google.gwt.user.client.ui.RootPanel; 10 | import com.redspr.redquerybuilder.core.client.command.CommandBuilder; 11 | import com.redspr.redquerybuilder.core.client.table.TableFilter; 12 | 13 | @Ignore 14 | public class AbstractTest extends GWTTestCase { 15 | 16 | @Override 17 | public void gwtSetUp() { 18 | TableFilter.resetAlias(); 19 | } 20 | 21 | 22 | // XXX not sure about this 23 | protected JsConfiguration conf; 24 | 25 | protected CommandBuilder builder; 26 | 27 | 28 | 29 | public static native void addHandlers(JsConfiguration config) /*-{ 30 | config.onSqlChange = function(sql, args) { 31 | config.lastSql = sql; 32 | config.lastArgs = args; 33 | } 34 | }-*/; 35 | 36 | public static native String getLastSql(JsConfiguration config) /*-{ 37 | return config.lastSql; 38 | }-*/; 39 | 40 | public static native JsArrayMixed getLastArgs(JsConfiguration config) /*-{ 41 | return config.lastArgs; 42 | }-*/; 43 | 44 | protected void test(String json, String sql, JsArrayMixed args, String msg) throws Throwable { 45 | RootPanel.get().getElement().setAttribute("id", "rqb"); 46 | 47 | try { 48 | if (json != null) { 49 | conf = (JsConfiguration) JsonUtils.unsafeEval(json); 50 | addHandlers(conf); 51 | } 52 | builder = RedQueryBuilder.configure(conf, sql, args); 53 | assertTrue(builder != null); 54 | if (msg != null) { 55 | fail("Was expecting the error message: " + msg); 56 | } 57 | } catch (Throwable th) { 58 | if (msg != null) { 59 | assertEquals(msg, th.getMessage()); 60 | } else { 61 | throw th; 62 | } 63 | } 64 | } 65 | 66 | protected JsArrayMixed args(Object... args) { 67 | JsArrayMixed result = (JsArrayMixed) JavaScriptObject.createArray(); 68 | 69 | for (Object x : args) { 70 | if (x instanceof String) { 71 | result.push((String) x); 72 | } else { 73 | result.push((JavaScriptObject) x); 74 | } 75 | } 76 | return result; 77 | } 78 | 79 | protected void test(String json, String msg) throws Throwable { 80 | test(json, "SELECT id FROM Foo", null, msg); 81 | } 82 | 83 | @Override 84 | public String getModuleName() { 85 | return "com.redspr.redquerybuilder.js.RedQueryBuilder"; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/test/java/com/redspr/redquerybuilder/js/client/GwtTestBasics.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import org.junit.Test; 7 | 8 | import com.google.gwt.core.client.JsArrayMixed; 9 | import com.google.gwt.core.client.JsDate; 10 | import com.google.gwt.core.client.JsonUtils; 11 | 12 | public class GwtTestBasics extends AbstractTest { 13 | 14 | // TODO __ test putting dates, numbers into the args 15 | 16 | 17 | @Test 18 | public void testNothing() throws Throwable { 19 | test(null, "Config is null."); 20 | } 21 | 22 | @Test 23 | public void testEmptyConfig() throws Throwable { 24 | test("{}", "Meta is null."); 25 | } 26 | 27 | @Test 28 | public void testNoTables() throws Throwable { 29 | test("{meta:{}}", "Unable to find table FOO"); 30 | } 31 | 32 | @Test 33 | public void testNoFksInJson() throws Throwable { 34 | test("{meta:{tables:[{name:'Foo'}]}}", null); 35 | } 36 | 37 | @Test 38 | public void testLegacyFk() { 39 | JsFk fk = (JsFk) JsonUtils.unsafeEval("{pkColumnNames:['sillyName'], fkTableName:'almostAsSilly', fkColumnNames:['middleSilly']}"); 40 | assertEquals("sillyName", fk.getForeignKeyNames().get(0)); 41 | assertEquals("almostAsSilly", fk.getReferencedTableName()); 42 | assertEquals("middleSilly", fk.getReferencedKeyNames().get(0)); 43 | } 44 | 45 | 46 | 47 | @Test 48 | public void testInAndArgs() throws Throwable { 49 | String json = Resources.INSTANCE.synchronous().getText(); 50 | 51 | test(json, "SELECT priority FROM ticket WHERE priority IN (?)", args("foo"), null); 52 | 53 | builder.fireDirty(); 54 | 55 | assertEquals(1, getLastArgs(conf).length()); 56 | assertEquals("foo", getLastArgs(conf).getString(0)); 57 | } 58 | 59 | @Test 60 | public void testArrayParameterIn() throws Throwable { 61 | String json = Resources.INSTANCE.synchronous().getText(); 62 | 63 | test(json, "SELECT priority FROM ticket WHERE priority IN (?, ?)", args("foo", "bar"), null); 64 | 65 | builder.fireDirty(); 66 | 67 | assertEquals(2, getLastArgs(conf).length()); 68 | assertEquals("foo", getLastArgs(conf).getString(0)); 69 | assertEquals("bar", getLastArgs(conf).getString(1)); 70 | } 71 | 72 | @Test 73 | public void testDateInAndOut() throws Throwable { 74 | String json = Resources.INSTANCE.minimalDateMeta().getText(); 75 | JsDate dateIn = JsDate.create(); 76 | dateIn.setUTCFullYear(1914); 77 | dateIn.setUTCMonth(4); 78 | dateIn.setUTCDate(15); 79 | dateIn.setUTCHours(22); 80 | dateIn.setUTCMinutes(13); 81 | test(json, "SELECT dob FROM person WHERE dob = ?", args(dateIn), null); 82 | 83 | builder.fireDirty(); 84 | 85 | assertEquals(1, getLastArgs(conf).length()); 86 | JsDate dateOut = getLastArgs(conf).getObject(0); 87 | assertEquals(1914, dateOut.getUTCFullYear()); 88 | assertEquals(4, dateOut.getUTCMonth()); 89 | assertEquals(15, dateOut.getUTCDate()); 90 | assertEquals(22, dateOut.getUTCHours()); 91 | assertEquals(13, dateOut.getUTCMinutes()); 92 | } 93 | 94 | public void testNullSqlAndNullArgs() throws Throwable { 95 | String json = Resources.INSTANCE.synchronous().getText(); 96 | 97 | test(json, null, null, null); 98 | 99 | builder.fireDirty(); 100 | } 101 | 102 | public void testJsList() throws Throwable { 103 | JsDate dateIn = JsDate.create(); 104 | dateIn.setUTCFullYear(1914); 105 | dateIn.setUTCMonth(4); 106 | dateIn.setUTCDate(15); 107 | dateIn.setUTCHours(22); 108 | dateIn.setUTCMinutes(13); 109 | 110 | JsArrayMixed mixed = (JsArrayMixed) JsArrayMixed.createArray(); 111 | mixed.push(dateIn); 112 | mixed.push(new Double(123.12d)); 113 | mixed.push("123"); 114 | mixed.push("false"); 115 | 116 | List list = JsList.get().toList(mixed); 117 | Date dateOut = (Date) list.get(0); 118 | Date dateOutUtc = new Date(dateOut.getTime() + 60 * 1000 * dateOut.getTimezoneOffset()); 119 | assertEquals(14, dateOutUtc.getYear()); 120 | assertEquals(4, dateOutUtc.getMonth()); 121 | assertEquals(15, dateOutUtc.getDate()); 122 | assertEquals(22, dateOutUtc.getHours()); 123 | assertEquals(13, dateOutUtc.getMinutes()); 124 | 125 | assertEquals(new Double(123.12d), list.get(1)); 126 | assertEquals("123", list.get(2)); 127 | assertEquals("false", list.get(3)); 128 | } 129 | 130 | } 131 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/test/java/com/redspr/redquerybuilder/js/client/GwtTestJsVisitor.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import org.junit.Test; 4 | 5 | import com.google.gwt.core.client.JavaScriptObject; 6 | import com.google.gwt.user.client.ui.RootPanel; 7 | 8 | public class GwtTestJsVisitor extends AbstractTest { 9 | 10 | @Test 11 | public void testReadArguments() throws Throwable { 12 | 13 | RootPanel.get().getElement().setAttribute("id", "rqb"); 14 | //test(json, "SELECT priority FROM ticket WHERE priority IN (?, ?)", 15 | // args("foo", "bar"), null); 16 | 17 | JsConfiguration config = new VisitorJs().config(); 18 | JavaScriptObject result2 = new VisitorJs().start(config, "SELECT priority FROM ticket WHERE priority IN (?, ?)", 19 | args("foo", "bar")); 20 | 21 | String result = new VisitorJs().visitValues(result2); 22 | 23 | assertEquals("([foo, bar])", result); 24 | } 25 | 26 | @Test 27 | public void testAddMessages() { 28 | RootPanel.get().getElement().setAttribute("id", "rqb"); 29 | //test(json, "SELECT priority FROM ticket WHERE priority IN (?, ?)", 30 | // args("foo", "bar"), null); 31 | 32 | JsConfiguration config = new VisitorJs().config(); 33 | JavaScriptObject result2 = new VisitorJs().start(config, "SELECT priority FROM ticket WHERE priority IN (?, ?)", 34 | args("foo", "bar")); 35 | 36 | String result = new VisitorJs().visitMessages(result2); 37 | 38 | String html = RootPanel.get().getElement().getInnerHTML(); 39 | assertTrue(html.contains("Magical message")); 40 | } 41 | 42 | @Test 43 | public void testSerialise() throws Exception { 44 | // XXX copy n paste 45 | RootPanel.get().getElement().setAttribute("id", "rqb"); 46 | 47 | JsConfiguration config = new VisitorJs().config(); 48 | JavaScriptObject result2 = new VisitorJs().start(config, "SELECT priority FROM ticket WHERE priority IN (?, ?) AND priority = ?", 49 | args("foo", "bar")); 50 | 51 | String result = new VisitorJs().visitSerialise(result2); 52 | 53 | assertEquals("(SELECT:WIP(LOGIC:AND(COMPARISON:IN(COLUMN:PRIORITY)(PARAMETER:?))(COMPARISON:=(COLUMN:PRIORITY)(PARAMETER:?))))", result); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/test/java/com/redspr/redquerybuilder/js/client/MinimalDateMeta.json: -------------------------------------------------------------------------------- 1 | 2 | {meta : { 3 | tables : [ { 4 | "name" : "person", 5 | "label" : "Person", 6 | "columns" : [ { 7 | "name" : "dob", 8 | "label" : "Date of birth", 9 | "type" : "DATE" 10 | } ], 11 | fks : [] 12 | } ], 13 | 14 | types : [ { 15 | "name" : "DATE", 16 | "editor" : "DATE", 17 | "operators" : [ { 18 | "name" : "=", 19 | "label" : "is", 20 | "cardinality" : "ONE" 21 | }] 22 | } ] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/test/java/com/redspr/redquerybuilder/js/client/Resources.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.GWT; 4 | import com.google.gwt.resources.client.ClientBundle; 5 | import com.google.gwt.resources.client.TextResource; 6 | 7 | interface Resources extends ClientBundle { 8 | Resources INSTANCE = GWT.create(Resources.class); 9 | // TODO 00 use JSNI? 10 | @Source("SampleConfig1.js") 11 | TextResource synchronous(); 12 | 13 | @Source("MinimalDateMeta.json") 14 | TextResource minimalDateMeta(); 15 | } 16 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/test/java/com/redspr/redquerybuilder/js/client/SampleConfig1.js: -------------------------------------------------------------------------------- 1 | 2 | {meta : { 3 | tables : [ { 4 | "name" : "ticket", 5 | "label" : "Ticket", 6 | "columns" : [ { 7 | "name" : "priority", 8 | "label" : "Priority", 9 | "type" : "REF" 10 | } ], 11 | fks : [] 12 | } ], 13 | 14 | types : [ { 15 | "name" : "REF", 16 | "editor" : "SELECT", 17 | "operators" : [ { 18 | "name" : "IN", 19 | "label" : "any of", 20 | "cardinality" : "MULTI" 21 | }] 22 | } ] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /redquerybuilder-js/src/test/java/com/redspr/redquerybuilder/js/client/VisitorJs.java: -------------------------------------------------------------------------------- 1 | package com.redspr.redquerybuilder.js.client; 2 | 3 | import com.google.gwt.core.client.JavaScriptObject; 4 | import com.google.gwt.core.client.JsArrayMixed; 5 | 6 | 7 | public class VisitorJs { 8 | public final native JsConfiguration config() /*-{ 9 | return {meta : { 10 | tables : [ { 11 | "name" : "ticket", 12 | "label" : "Ticket", 13 | "columns" : [ { 14 | "name" : "priority", 15 | "label" : "Priority", 16 | "type" : "REF" 17 | } ], 18 | fks : [] 19 | } ], 20 | 21 | types : [ { 22 | "name" : "REF", 23 | "editor" : "SELECT", 24 | "operators" : [ { 25 | "name" : "IN", 26 | "label" : "any of", 27 | "cardinality" : "MULTI" 28 | }, 29 | { 30 | "name" : "=", 31 | "label" : "equals", 32 | "cardinality" : "ONE" 33 | }] 34 | } ] 35 | } 36 | } 37 | }-*/; 38 | 39 | public final native String visitValues(JavaScriptObject cb) /*-{ 40 | var visitor = new $wnd.rqb.Visitor(); 41 | 42 | var result = ''; 43 | visitor.visit = function(context) { 44 | var hasValue = context.asHasValue(); 45 | if (hasValue) { 46 | result += '(' + hasValue.getValue() + ')'; 47 | } 48 | } 49 | 50 | cb.accept(visitor); 51 | 52 | return result; 53 | }-*/; 54 | 55 | public final native String visitMessages(JavaScriptObject cb) /*-{ 56 | var visitor = new $wnd.rqb.Visitor(); 57 | 58 | var result = ''; 59 | visitor.visit = function(context) { 60 | var hasMessages = context.asHasMessages(); 61 | if (hasMessages) { 62 | var message = new $wnd.rqb.Message('Magical message'); 63 | 64 | hasMessages.showMessage(message); 65 | } 66 | } 67 | 68 | cb.accept(visitor); 69 | 70 | return result; 71 | }-*/; 72 | 73 | public final native String visitSerialise(JavaScriptObject cb) /*-{ 74 | var visitor = new $wnd.rqb.Visitor(); 75 | 76 | var result = ''; 77 | 78 | visitor.visit = function(context) { 79 | result += "(" + context.getNodeType() + ":" + context.getNodeName(); 80 | } 81 | visitor.endVisit = function(context) { 82 | result += ")"; 83 | } 84 | 85 | cb.accept(visitor); 86 | 87 | return result; 88 | }-*/; 89 | 90 | public final native JavaScriptObject start(JsConfiguration config, String sql, JsArrayMixed args) /*-{ 91 | return $wnd.redQueryBuilder(config, sql, args); 92 | }-*/; 93 | } 94 | -------------------------------------------------------------------------------- /redquerybuilder-parent/NOTES.txt: -------------------------------------------------------------------------------- 1 | Build everything 2 | mvn clean install 3 | 4 | To deploy to gae 5 | * cd jdbcsample 6 | * mvn clean install gae:update (have to do clean install due to version-parser bug) 7 | 8 | To release: 9 | * Change version in POMs 10 | * Update jdbcsample index.html 11 | * Update changes.xml 12 | * Commit changes 13 | * Tag and push 14 | * Update version in POMs 15 | --------------------------------------------------------------------------------