mirror of https://github.com/apache/openjpa.git
OPENJPA-805 JPQL updates iteration 1
add in-memory query constructs for Case, Coalesce, and NullIf expressions git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@726926 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5d27c28dd4
commit
47eab49812
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.kernel.exps;
|
||||||
|
|
||||||
|
import org.apache.openjpa.kernel.Filters;
|
||||||
|
import org.apache.openjpa.kernel.StoreContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An in-memory representation of a coalesce expression
|
||||||
|
*
|
||||||
|
* @author Catalina Wei
|
||||||
|
*/
|
||||||
|
public class Coalesce
|
||||||
|
extends Val {
|
||||||
|
|
||||||
|
private final Val[] _val;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
Coalesce(Val[] val) {
|
||||||
|
_val = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object eval(Object candidate, Object orig, StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
for (int i = 0; i < _val.length-1; i++) {
|
||||||
|
Object o1 = _val[i].eval(candidate, orig, ctx, params);
|
||||||
|
if (o1 != null)
|
||||||
|
return o1;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return _val[_val.length-1].eval(candidate, orig, ctx, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object eval(Object candidate, StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
for (int i = 0; i < _val.length-1; i++) {
|
||||||
|
Object o1 = _val[i].eval(candidate, null, ctx, params);
|
||||||
|
if (o1 != null)
|
||||||
|
return o1;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return _val[_val.length-1].eval(candidate, null, ctx, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the two values.
|
||||||
|
*/
|
||||||
|
protected boolean compare(Object o1, Object o2) {
|
||||||
|
return (o1 == null && o2 == null)
|
||||||
|
|| (o1 != null && o1.equals(o2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Val[] getVal() {
|
||||||
|
return _val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getType() {
|
||||||
|
Class c1 = _val[0].getType();
|
||||||
|
for (int i = 1; i < _val.length; i++) {
|
||||||
|
Class c2 = _val[i].getType();
|
||||||
|
c1 = Filters.promote(c1, c2);
|
||||||
|
}
|
||||||
|
return c1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImplicitType(Class type) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void acceptVisit(ExpressionVisitor visitor) {
|
||||||
|
visitor.enter(this);
|
||||||
|
for (int i = 0; i < _val.length; i++)
|
||||||
|
_val[i].acceptVisit(visitor);
|
||||||
|
visitor.exit(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.kernel.exps;
|
||||||
|
|
||||||
|
import org.apache.openjpa.kernel.Filters;
|
||||||
|
import org.apache.openjpa.kernel.StoreContext;
|
||||||
|
import org.apache.openjpa.lib.util.Localizer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An in-memory representation of a general case expression
|
||||||
|
*
|
||||||
|
* @author Catalina Wei
|
||||||
|
*/
|
||||||
|
class GeneralCase
|
||||||
|
extends Val {
|
||||||
|
|
||||||
|
private static final Localizer _loc = Localizer.forPackage(
|
||||||
|
GeneralCase.class);
|
||||||
|
|
||||||
|
private final Exp[] _exp;
|
||||||
|
private final Val _val;
|
||||||
|
|
||||||
|
public GeneralCase(Exp[] exp, Val val) {
|
||||||
|
_exp = exp;
|
||||||
|
_val = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object eval(Object candidate, Object orig, StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
for (int i = 0; i < _exp.length; i++) {
|
||||||
|
boolean compare = ((WhenCondition) _exp[i]).getExp().
|
||||||
|
eval(candidate, orig, ctx, params);
|
||||||
|
|
||||||
|
if (compare)
|
||||||
|
return ((WhenCondition) _exp[i]).getVal().
|
||||||
|
eval(candidate, orig, ctx, params);
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return _val.eval(candidate, orig, ctx, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object eval(Object candidate,StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
|
||||||
|
for (int i = 0; i < _exp.length; i++) {
|
||||||
|
boolean compare = ((WhenCondition) _exp[i]).getExp().
|
||||||
|
eval(candidate, null, ctx, params);
|
||||||
|
|
||||||
|
if (compare)
|
||||||
|
return ((WhenCondition) _exp[i]).getVal().
|
||||||
|
eval(candidate, null, ctx, params);
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return _val.eval(candidate, null, ctx, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getType() {
|
||||||
|
Class c1 = _val.getType();
|
||||||
|
for (int i = 0; i < _exp.length; i++) {
|
||||||
|
Class c2 = ((WhenCondition) _exp[i]).getVal().getType();
|
||||||
|
c1 = Filters.promote(c1, c2);
|
||||||
|
}
|
||||||
|
return c1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImplicitType(Class type) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void acceptVisit(ExpressionVisitor visitor) {
|
||||||
|
visitor.enter(this);
|
||||||
|
for (int i = 0; i < _exp.length; i++)
|
||||||
|
_exp[i].acceptVisit(visitor);
|
||||||
|
_val.acceptVisit(visitor);
|
||||||
|
visitor.exit(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -727,32 +727,36 @@ public class InMemoryExpressionFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
public Value generalCaseExpression(Expression[] exp, Value val) {
|
public Value generalCaseExpression(Expression[] exp, Value val) {
|
||||||
// TODO Auto-generated method stub
|
Exp[] exps = new Exp[exp.length];
|
||||||
return null;
|
for (int i = 0; i < exp.length; i++)
|
||||||
|
exps[i] = (Exp) exp[i];
|
||||||
|
return new GeneralCase(exps, (Val) val);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Value simpleCaseExpression(Value caseOperand, Expression[] exp, Value val) {
|
public Value simpleCaseExpression(Value caseOperand, Expression[] exp,
|
||||||
// TODO Auto-generated method stub
|
Value val) {
|
||||||
return null;
|
Exp[] exps = new Exp[exp.length];
|
||||||
|
for (int i = 0; i < exp.length; i++)
|
||||||
|
exps[i] = (Exp) exp[i];
|
||||||
|
return new SimpleCase((Val) caseOperand, exps, (Val) val);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression whenCondition(Expression exp, Value val) {
|
public Expression whenCondition(Expression exp, Value val) {
|
||||||
// TODO Auto-generated method stub
|
return new WhenCondition((Exp) exp, (Val) val);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression whenScalar(Value val1, Value val2) {
|
public Expression whenScalar(Value val1, Value val2) {
|
||||||
// TODO Auto-generated method stub
|
return new WhenScalar((Val) val1, (Val) val2);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Value coalesceExpression(Value[] val) {
|
public Value coalesceExpression(Value[] val) {
|
||||||
// TODO Auto-generated method stub
|
Val[] vals = new Val[val.length];
|
||||||
return null;
|
for (int i = 0; i < val.length; i++)
|
||||||
|
vals[i] = (Val) val[i];
|
||||||
|
return new Coalesce(vals);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Value nullIfExpression(Value val1, Value val2) {
|
public Value nullIfExpression(Value val1, Value val2) {
|
||||||
// TODO Auto-generated method stub
|
return new NullIf((Val) val1, (Val) val2);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.kernel.exps;
|
||||||
|
|
||||||
|
import org.apache.openjpa.kernel.Filters;
|
||||||
|
import org.apache.openjpa.kernel.StoreContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An in-memory representation of a nullif expression
|
||||||
|
*
|
||||||
|
* @author Catalina Wei
|
||||||
|
*/
|
||||||
|
public class NullIf
|
||||||
|
extends Val {
|
||||||
|
|
||||||
|
private final Val _val1;
|
||||||
|
private final Val _val2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
NullIf(Val val1, Val val2) {
|
||||||
|
_val1 = val1;
|
||||||
|
_val2 = val2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object eval(Object candidate, Object orig, StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
Object o1 = _val1.eval(candidate, orig, ctx, params);
|
||||||
|
Object o2 = _val2.eval(candidate, orig, ctx, params);
|
||||||
|
if (o1 != null && o2 != null) {
|
||||||
|
Class c = Filters.promote(o1.getClass(), o2.getClass());
|
||||||
|
o1 = Filters.convert(o1, c);
|
||||||
|
o2 = Filters.convert(o2, c);
|
||||||
|
}
|
||||||
|
if (compare(o1, o2))
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return o1;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object eval(Object candidate, StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
Object o1 = _val1.eval(candidate, null, ctx, params);
|
||||||
|
Object o2 = _val2.eval(candidate, null, ctx, params);
|
||||||
|
if (o1 != null && o2 != null) {
|
||||||
|
Class c = Filters.promote(o1.getClass(), o2.getClass());
|
||||||
|
o1 = Filters.convert(o1, c);
|
||||||
|
o2 = Filters.convert(o2, c);
|
||||||
|
}
|
||||||
|
if (compare(o1, o2))
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return o1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the two values.
|
||||||
|
*/
|
||||||
|
protected boolean compare(Object o1, Object o2) {
|
||||||
|
return (o1 == null && o2 == null)
|
||||||
|
|| (o1 != null && o1.equals(o2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Val getVal1() {
|
||||||
|
return _val1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Val getVal2() {
|
||||||
|
return _val2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getType() {
|
||||||
|
return _val1.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImplicitType(Class type) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void acceptVisit(ExpressionVisitor visitor) {
|
||||||
|
visitor.enter(this);
|
||||||
|
_val1.acceptVisit(visitor);
|
||||||
|
_val2.acceptVisit(visitor);
|
||||||
|
visitor.exit(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
package org.apache.openjpa.kernel.exps;
|
||||||
|
|
||||||
|
import org.apache.openjpa.kernel.Filters;
|
||||||
|
import org.apache.openjpa.kernel.StoreContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An in-memory representation of a simple case expression
|
||||||
|
*
|
||||||
|
* @author Catalina Wei
|
||||||
|
*/
|
||||||
|
public class SimpleCase extends Val {
|
||||||
|
private final Val _caseOperand;
|
||||||
|
private final Exp[] _exp;
|
||||||
|
private final Val _val;
|
||||||
|
|
||||||
|
SimpleCase(Val caseOperand, Exp[] exp, Val val) {
|
||||||
|
_caseOperand = caseOperand;
|
||||||
|
_exp = exp;
|
||||||
|
_val = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object eval(Object candidate, Object orig, StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
Object o1 = _caseOperand.eval(candidate, orig, ctx, params);
|
||||||
|
for (int i = 0; i < _exp.length; i++) {
|
||||||
|
Object o2 = ((WhenScalar) _exp[i]).getVal1().
|
||||||
|
eval(candidate, orig, ctx, params);
|
||||||
|
if (o1 != null && o2 != null) {
|
||||||
|
Class c = Filters.promote(o1.getClass(), o2.getClass());
|
||||||
|
o1 = Filters.convert(o1, c);
|
||||||
|
o2 = Filters.convert(o2, c);
|
||||||
|
}
|
||||||
|
if (compare(o1, o2))
|
||||||
|
return ((WhenScalar) _exp[i]).getVal2().
|
||||||
|
eval(candidate, orig, ctx, params);
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return _val.eval(candidate, orig, ctx, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object eval(Object candidate,StoreContext ctx,
|
||||||
|
Object[] params) {
|
||||||
|
Object o1 = _caseOperand.eval(candidate, null, ctx, params);
|
||||||
|
for (int i = 0; i < _exp.length; i++) {
|
||||||
|
Object o2 = ((WhenScalar) _exp[i]).getVal1().
|
||||||
|
eval(candidate, null, ctx, params);
|
||||||
|
if (o1 != null && o2 != null) {
|
||||||
|
Class c = Filters.promote(o1.getClass(), o2.getClass());
|
||||||
|
o1 = Filters.convert(o1, c);
|
||||||
|
o2 = Filters.convert(o2, c);
|
||||||
|
}
|
||||||
|
if (compare(o1, o2))
|
||||||
|
return ((WhenScalar) _exp[i]).getVal2().
|
||||||
|
eval(candidate, null, ctx, params);
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return _val.eval(candidate, null, ctx, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the two values.
|
||||||
|
*/
|
||||||
|
protected boolean compare(Object o1, Object o2) {
|
||||||
|
return (o1 == null && o2 == null)
|
||||||
|
|| (o1 != null && o1.equals(o2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getType() {
|
||||||
|
Class c1 = _val.getType();
|
||||||
|
for (int i = 0; i < _exp.length; i++) {
|
||||||
|
Class c2 = ((WhenScalar) _exp[i]).getVal1().getType();
|
||||||
|
c1 = Filters.promote(c1, c2);
|
||||||
|
}
|
||||||
|
return c1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImplicitType(Class type) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void acceptVisit(ExpressionVisitor visitor) {
|
||||||
|
visitor.enter(this);
|
||||||
|
_caseOperand.acceptVisit(visitor);
|
||||||
|
for (int i = 0; i < _exp.length; i++)
|
||||||
|
_exp[i].acceptVisit(visitor);
|
||||||
|
_val.acceptVisit(visitor);
|
||||||
|
visitor.exit(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.kernel.exps;
|
||||||
|
|
||||||
|
public class WhenCondition
|
||||||
|
extends Exp {
|
||||||
|
|
||||||
|
private final Exp _exp;
|
||||||
|
private final Val _val;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
WhenCondition(Exp exp, Val val) {
|
||||||
|
_exp = exp;
|
||||||
|
_val = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exp getExp() {
|
||||||
|
return _exp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Val getVal() {
|
||||||
|
return _val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void acceptVisit(ExpressionVisitor visitor) {
|
||||||
|
visitor.enter(this);
|
||||||
|
_exp.acceptVisit(visitor);
|
||||||
|
_val.acceptVisit(visitor);
|
||||||
|
visitor.exit(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.kernel.exps;
|
||||||
|
|
||||||
|
public class WhenScalar
|
||||||
|
extends Exp {
|
||||||
|
|
||||||
|
private final Val _val1;
|
||||||
|
private final Val _val2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
WhenScalar(Val val1, Val val2) {
|
||||||
|
_val1 = val1;
|
||||||
|
_val2 = val2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Val getVal1() {
|
||||||
|
return _val1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Val getVal2() {
|
||||||
|
return _val2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void acceptVisit(ExpressionVisitor visitor) {
|
||||||
|
visitor.enter(this);
|
||||||
|
_val1.acceptVisit(visitor);
|
||||||
|
_val2.acceptVisit(visitor);
|
||||||
|
visitor.exit(this);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue