User: dsundstrom
Date: 01/08/18 08:56:43
Modified: src/main/org/jboss/ejb/plugins/cmp/ejbql Assembly.java
InputParameterToken.java Literal.java
NumberState.java Parser.java StringLiteral.java
Symbol.java Terminal.java
Log:
fixed many small anoying bugs while implementing the ejbql to sql translation engine
Revision Changes Path
1.2 +14 -5 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Assembly.java
Index: Assembly.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Assembly.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Assembly.java 2001/08/09 05:20:49 1.1
+++ Assembly.java 2001/08/18 15:56:43 1.2
@@ -4,11 +4,12 @@
import java.util.ArrayList;
import java.util.List;
-public class Assembly implements DeepCloneable {
+public class Assembly {
private DeepCloneable target;
private List stack = new ArrayList();
private List tokens = new ArrayList();
private int tokenIndex;
+ private boolean valid = true;
public Assembly(Assembly a) {
if(a.target != null) {
@@ -17,6 +18,7 @@
stack = new ArrayList(a.stack);
tokens = new ArrayList(a.tokens);
tokenIndex = a.tokenIndex;
+ valid = a.valid;
}
public Assembly(String string) {
@@ -34,7 +36,18 @@
tokenIndex = 0;
}
+ public boolean isValid() {
+ return valid;
+ }
+
+ public void setInvalid() {
+ valid = false;
+ }
+
public void push(Object object) {
+ if(object == null) {
+ throw new IllegalArgumentException("object is null");
+ }
stack.add(object);
}
@@ -89,9 +102,5 @@
buf.append("^");
}
return buf.toString();
- }
-
- public Object deepClone() {
- return new Assembly(this);
}
}
1.2 +4 -0
jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/InputParameterToken.java
Index: InputParameterToken.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/InputParameterToken.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- InputParameterToken.java 2001/08/09 05:20:49 1.1
+++ InputParameterToken.java 2001/08/18 15:56:43 1.2
@@ -7,6 +7,10 @@
this.num = num;
}
+ public int getNumber() {
+ return num;
+ }
+
public int hashCode() {
return 37 * 17 + num;
}
1.2 +4 -0 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Literal.java
Index: Literal.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Literal.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Literal.java 2001/08/09 05:20:49 1.1
+++ Literal.java 2001/08/18 15:56:43 1.2
@@ -16,4 +16,8 @@
}
return false;
}
+
+ public String toString() {
+ return "[Literal: literal="+literal+"]";
+ }
}
1.5 +0 -5 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/NumberState.java
Index: NumberState.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/NumberState.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- NumberState.java 2001/08/09 21:51:14 1.4
+++ NumberState.java 2001/08/18 15:56:43 1.5
@@ -49,7 +49,6 @@
readSuffix(in, out);
String number = out.toString().toLowerCase();
- System.out.println("number is ["+number+"]");
if(isExactNumeric(number)) {
return createExactNumericToken(number);
} else {
@@ -65,7 +64,6 @@
// is it a hex number
int second = peekChar(in);
- System.out.println("HEX? " + (char)first + (char)second);
if(first == '0' && (second == 'x' || second == 'X')) {
// read the x off the stream and write it out
out.write(in.read());
@@ -89,8 +87,6 @@
// get all the decimal digits
readNumber(in, out, 10);
-
- System.out.println("Read fractional part numebr is
["+out.toString()+"]");
}
}
@@ -175,7 +171,6 @@
// chop off the suffix
number = number.substring(0, number.length() - 1);
}
- System.out.println("decode exact number [" + number + "]");
if (number.startsWith("0X") || number.startsWith("0x")) { // hex
// handle literals from 0x8000000000000000L to 0xffffffffffffffffL:
// remove sign bit, parse as positive, then calculate the negative
value with the sign bit
1.2 +36 -5 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Parser.java
Index: Parser.java
===================================================================
RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Parser.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Parser.java 2001/08/09 05:20:49 1.1
+++ Parser.java 2001/08/18 15:56:43 1.2
@@ -11,10 +11,17 @@
public abstract AssemblySet match(AssemblySet in);
public AssemblySet matchAndAssemble(AssemblySet in) {
- AssemblySet out = match(in);
- if(assembler != null) {
- for(Iterator i = out.iterator(); i.hasNext(); ) {
- assembler.workOn((Assembly)i.next());
+ AssemblySet matchedSet = match(in);
+ if(assembler == null) {
+ return matchedSet;
+ }
+
+ AssemblySet out = new AssemblySet();
+ for(Iterator i = matchedSet.iterator(); i.hasNext(); ) {
+ Assembly a = (Assembly)i.next();
+ assembler.workOn(a);
+ if(a.isValid()) {
+ out.add(a);
}
}
return out;
@@ -34,8 +41,32 @@
}
return best;
}
+
+ public Assembly soleMatch(Assembly in) {
+ AssemblySet set = new AssemblySet();
+ set.add(in);
+ set = matchAndAssemble(set);
+
+ AssemblySet completeMatches = new AssemblySet();
+ for(Iterator i = set.iterator(); i.hasNext(); ) {
+ Assembly a = (Assembly) i.next();
+
+ // is this a complete match, can't get better then that
+ if(!a.hasNextToken()) {
+ completeMatches.add(a);
+ }
+ }
+
+ if(completeMatches.size()==0) {
+ return best(set);
+ }
+ if(completeMatches.size() > 1) {
+ throw new IllegalStateException("Multiple assemblies matched:
"+set.size());
+ }
+ return (Assembly)completeMatches.iterator().next();;
+ }
- public void setAssembler(Assembler a) {
+ public void setAssembler(Assembler assembler) {
this.assembler = assembler;
}
1.3 +4 -0
jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/StringLiteral.java
Index: StringLiteral.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/StringLiteral.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- StringLiteral.java 2001/08/09 05:20:49 1.2
+++ StringLiteral.java 2001/08/18 15:56:43 1.3
@@ -8,4 +8,8 @@
protected boolean isValidToken(Token token) {
return token instanceof StringToken;
}
+
+ public String toString() {
+ return "[StringLiteral]";
+ }
}
1.2 +4 -0 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Symbol.java
Index: Symbol.java
===================================================================
RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Symbol.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Symbol.java 2001/08/09 05:20:49 1.1
+++ Symbol.java 2001/08/18 15:56:43 1.2
@@ -13,4 +13,8 @@
protected boolean isValidToken(Token token) {
return symbol.equals(token);
}
+
+ public String toString() {
+ return "[Symbol: symbol="+symbol+"]";
+ }
}
1.2 +13 -0 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Terminal.java
Index: Terminal.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/Terminal.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Terminal.java 2001/08/09 05:20:49 1.1
+++ Terminal.java 2001/08/18 15:56:43 1.2
@@ -4,6 +4,7 @@
public abstract class Terminal extends Parser {
private boolean discardTokens = false;
+ private boolean debug = false;
public Terminal() {
}
@@ -16,6 +17,16 @@
this.discardTokens = discardTokens;
}
+ public Terminal discard() {
+ discardTokens = true;
+ return this;
+ }
+
+ public Terminal debug() {
+ debug = true;
+ return this;
+ }
+
public AssemblySet match(AssemblySet inSet) {
AssemblySet out = new AssemblySet();
for(Iterator i = inSet.iterator(); i.hasNext(); ) {
@@ -44,9 +55,11 @@
out.push(token);
}
// return the new assembly
+ if(debug)System.out.println("Terminal "+this+" matched.
newAssembly="+out);
return out;
}
// no match return null
+ if(debug)System.out.println("Terminal "+this+" DID NOT match
assembly="+assembly);
return null;
}
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development