mirror of https://github.com/apache/openjpa.git
OPENJPA-617 Add support for calculating update value in QueryImpl.updateInMemory
Help comitting patch provided by Fay Wang Add support for in-memory math - sqrt, abs functions git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@661472 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d1aa6a2c48
commit
48b1fb5a37
|
@ -707,6 +707,10 @@ public class JDBCStoreQuery
|
||||||
return handleTrimVal(value, ob, params, sm);
|
return handleTrimVal(value, ob, params, sm);
|
||||||
case Val.INDEXOF_VAL:
|
case Val.INDEXOF_VAL:
|
||||||
return handleIndexOfVal(value, ob, params, sm);
|
return handleIndexOfVal(value, ob, params, sm);
|
||||||
|
case Val.ABS_VAL:
|
||||||
|
return handleAbsVal(value, ob, params, sm);
|
||||||
|
case Val.SQRT_VAL:
|
||||||
|
return handleSqrtVal(value, ob, params, sm);
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedException();
|
throw new UnsupportedException();
|
||||||
}
|
}
|
||||||
|
@ -853,11 +857,47 @@ public class JDBCStoreQuery
|
||||||
(org.apache.openjpa.jdbc.kernel.exps.IndexOf) value;
|
(org.apache.openjpa.jdbc.kernel.exps.IndexOf) value;
|
||||||
String val1 = (String) getValue(locateVal.getVal1(), ob, params, sm);
|
String val1 = (String) getValue(locateVal.getVal1(), ob, params, sm);
|
||||||
Val[] val2 = (Val[]) getValue(locateVal.getVal2(), ob, params, sm);
|
Val[] val2 = (Val[]) getValue(locateVal.getVal2(), ob, params, sm);
|
||||||
String strVal = (String)getValue(val2[0], ob, params, sm);
|
String strVal = (String) getValue(val2[0], ob, params, sm);
|
||||||
int idx = ((Long) getValue(val2[1], ob, params, sm)).intValue();
|
int idx = ((Long) getValue(val2[1], ob, params, sm)).intValue();
|
||||||
return strVal.indexOf(val1, idx);
|
return strVal.indexOf(val1, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Object handleAbsVal(Object value, Object ob, Object[] params,
|
||||||
|
OpenJPAStateManager sm) {
|
||||||
|
org.apache.openjpa.jdbc.kernel.exps.Abs absVal =
|
||||||
|
(org.apache.openjpa.jdbc.kernel.exps.Abs) value;
|
||||||
|
Object val = getValue(absVal.getValue(), ob, params, sm);
|
||||||
|
Class c = val.getClass();
|
||||||
|
if (c == Integer.class)
|
||||||
|
return new Integer(java.lang.Math.abs(((Integer) val).intValue()));
|
||||||
|
else if (c == Float.class)
|
||||||
|
return new Float(java.lang.Math.abs(((Float) val).floatValue()));
|
||||||
|
else if (c == Double.class)
|
||||||
|
return new Double(java.lang.Math.abs(((Double) val).doubleValue()));
|
||||||
|
else if (c == Long.class)
|
||||||
|
return new Long(java.lang.Math.abs(((Long) val).longValue()));
|
||||||
|
throw new UnsupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object handleSqrtVal(Object value, Object ob, Object[] params,
|
||||||
|
OpenJPAStateManager sm) {
|
||||||
|
org.apache.openjpa.jdbc.kernel.exps.Sqrt sqrtVal =
|
||||||
|
(org.apache.openjpa.jdbc.kernel.exps.Sqrt) value;
|
||||||
|
Object val = getValue(sqrtVal.getValue(), ob, params, sm);
|
||||||
|
Class c = val.getClass();
|
||||||
|
if (c == Integer.class)
|
||||||
|
return new Double(java.lang.Math.sqrt(((Integer) val).
|
||||||
|
doubleValue()));
|
||||||
|
else if (c == Float.class)
|
||||||
|
return new Double(java.lang.Math.sqrt(((Float) val).floatValue()));
|
||||||
|
else if (c == Double.class)
|
||||||
|
return new Double(java.lang.Math.sqrt(((Double) val).
|
||||||
|
doubleValue()));
|
||||||
|
else if (c == Long.class)
|
||||||
|
return new Double(java.lang.Math.sqrt(((Long) val).doubleValue()));
|
||||||
|
throw new UnsupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
private Object getValue(Object value, Object ob, Object[] params,
|
private Object getValue(Object value, Object ob, Object[] params,
|
||||||
OpenJPAStateManager sm) {
|
OpenJPAStateManager sm) {
|
||||||
if (value instanceof PCPath) {
|
if (value instanceof PCPath) {
|
||||||
|
|
|
@ -26,7 +26,7 @@ import org.apache.openjpa.kernel.Filters;
|
||||||
/**
|
/**
|
||||||
* Absolute value.
|
* Absolute value.
|
||||||
*/
|
*/
|
||||||
class Abs
|
public class Abs
|
||||||
extends UnaryOp {
|
extends UnaryOp {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,5 +51,9 @@ class Abs
|
||||||
protected String getOperator() {
|
protected String getOperator() {
|
||||||
return "ABS";
|
return "ABS";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return Val.ABS_VAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,5 +154,9 @@ public class Math
|
||||||
_val2.acceptVisit(visitor);
|
_val2.acceptVisit(visitor);
|
||||||
visitor.exit(this);
|
visitor.exit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return Val.MATH_VAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ package org.apache.openjpa.jdbc.kernel.exps;
|
||||||
*
|
*
|
||||||
* @author Abe White
|
* @author Abe White
|
||||||
*/
|
*/
|
||||||
class Sqrt
|
public class Sqrt
|
||||||
extends UnaryOp {
|
extends UnaryOp {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,5 +40,9 @@ class Sqrt
|
||||||
protected String getOperator() {
|
protected String getOperator() {
|
||||||
return "SQRT";
|
return "SQRT";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return Val.SQRT_VAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ abstract class UnaryOp
|
||||||
_noParen = noParen;
|
_noParen = noParen;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Val getValue() {
|
public Val getValue() {
|
||||||
return _val;
|
return _val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,8 @@ public interface Val
|
||||||
public final int LOCATE_VAL = 8;
|
public final int LOCATE_VAL = 8;
|
||||||
public final int ARGS_VAL = 9;
|
public final int ARGS_VAL = 9;
|
||||||
public final int INDEXOF_VAL = 10;
|
public final int INDEXOF_VAL = 10;
|
||||||
|
public final int ABS_VAL = 11;
|
||||||
|
public final int SQRT_VAL = 12;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the value. This method should recursively initialize any
|
* Initialize the value. This method should recursively initialize any
|
||||||
|
|
Loading…
Reference in New Issue