Simplified implementation of SimpleParameterAccessor.

Changed API of Parameters and Parameter class accordingly. Adapted test cases as well.
This commit is contained in:
Oliver Gierke
2010-12-07 20:47:28 +01:00
parent a551a6a061
commit e1ffab6131
4 changed files with 16 additions and 57 deletions

View File

@@ -78,19 +78,6 @@ public final class Parameter {
}
/**
* Copy constructor to put a {@link Parameter} into another context.
*
* @param parameter
* @param parameters
* @param index
*/
Parameter(Parameter parameter, Parameters parameters, int index) {
this(parameter.type, parameters, index, parameter.name);
}
/**
* Returns whether the {@link Parameter} is the first one.
*
@@ -162,7 +149,7 @@ public final class Parameter {
if (isNamedParameter()) {
return format(NAMED_PARAMETER_TEMPLATE, getName());
} else {
return format(POSITION_PARAMETER_TEMPLATE, getParameterIndex());
return format(POSITION_PARAMETER_TEMPLATE, getIndex());
}
}
@@ -173,9 +160,9 @@ public final class Parameter {
*
* @return
*/
public int getParameterIndex() {
public int getIndex() {
return parameters.getPlaceholderPosition(this);
return index;
}

View File

@@ -124,8 +124,7 @@ public final class Parameters implements Iterable<Parameter> {
for (int i = 0; i < originals.size(); i++) {
Parameter original = originals.get(i);
this.parameters.add(new Parameter(original, this, i));
this.parameters.add(original);
pageableIndexTemp = original.isPageable() ? i : -1;
sortIndexTemp = original.isSort() ? i : -1;
@@ -265,29 +264,17 @@ public final class Parameters implements Iterable<Parameter> {
/**
* Returns the index of the placeholder inside a query for the parameter
* with the given index. They might differ from the parameter index as the
* method signature can contain special parameters (e.g. {@link Sort},
* {@link Pageable}) that are not bound as plain query parameters but rather
* handled differently.
* Returns a bindable parameter with the given index. So for a method with a
* signature of {@code (Pageable pageable, String name)} a call to
* {@code #getBindableParameter(0)} will return the {@link String}
* parameter.
*
* @param index
* @return the placeholder postion for the parameter with the given index.
* Will return -1 for special parameters.
* @param bindableIndex
* @return
*/
int getPlaceholderPosition(Parameter parameter) {
public Parameter getBindableParameter(int bindableIndex) {
return parameter.isSpecialParameter() ? -1
: getPlaceholderPositionRecursively(parameter);
}
private int getPlaceholderPositionRecursively(Parameter parameter) {
int result = parameter.isSpecialParameter() ? 0 : 1;
return parameter.isFirst() ? result - 1 : result
+ getPlaceholderPositionRecursively(parameter.getPrevious());
return getBindableParameters().getParameter(bindableIndex);
}

View File

@@ -90,20 +90,8 @@ public class SimpleParameterAccessor {
private Object getBindableValue(int index) {
int bindableCount = 0;
for (Parameter parameter : parameters) {
if (parameter.isBindable() && bindableCount == index) {
return values[parameter.getParameterIndex()];
}
if (parameter.isBindable()) {
bindableCount++;
}
}
throw new IllegalArgumentException();
return values[parameters.getBindableParameter(index).getIndex()];
}

View File

@@ -102,9 +102,7 @@ public class ParametersUnitTests {
String.class);
Parameters parameters = new Parameters(method);
assertThat(parameters.getParameter(0).getParameterIndex(), is(-1));
assertThat(parameters.getParameter(1).getParameterIndex(), is(0));
assertThat(parameters.getBindableParameter(0).getIndex(), is(1));
method =
SampleDao.class.getMethod("validWithSortInBetween",
@@ -112,9 +110,8 @@ public class ParametersUnitTests {
parameters = new Parameters(method);
assertThat(parameters.getParameter(0).getParameterIndex(), is(0));
assertThat(parameters.getParameter(1).getParameterIndex(), is(-1));
assertThat(parameters.getParameter(2).getParameterIndex(), is(1));
assertThat(parameters.getBindableParameter(0).getIndex(), is(0));
assertThat(parameters.getBindableParameter(1).getIndex(), is(2));
}