8 changed files with 178 additions and 14 deletions
@ -0,0 +1,47 @@
|
||||
package com.jayway.jsonpath.internal.function.sequence; |
||||
|
||||
import com.jayway.jsonpath.JsonPathException; |
||||
import com.jayway.jsonpath.internal.EvaluationContext; |
||||
import com.jayway.jsonpath.internal.PathRef; |
||||
import com.jayway.jsonpath.internal.function.Parameter; |
||||
import com.jayway.jsonpath.internal.function.PathFunction; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Defines the pattern for taking item from collection of JSONArray by index |
||||
* |
||||
* Created by git9527 on 6/11/22. |
||||
*/ |
||||
public abstract class AbstractSequenceAggregation implements PathFunction { |
||||
|
||||
protected abstract int targetIndex(EvaluationContext ctx, List<Parameter> parameters); |
||||
|
||||
@Override |
||||
public Object invoke(String currentPath, PathRef parent, Object model, EvaluationContext ctx, List<Parameter> parameters) { |
||||
if(ctx.configuration().jsonProvider().isArray(model)){ |
||||
|
||||
Iterable<?> objects = ctx.configuration().jsonProvider().toIterable(model); |
||||
List<Object> objectList = new ArrayList<>(); |
||||
objects.forEach(objectList::add); |
||||
int targetIndex = this.targetIndex(ctx, parameters); |
||||
if (targetIndex >= 0) { |
||||
return objectList.get(targetIndex); |
||||
} else { |
||||
int realIndex = objectList.size() + targetIndex; |
||||
if (realIndex > 0) { |
||||
return objectList.get(realIndex); |
||||
} else { |
||||
throw new JsonPathException("Target index:" + targetIndex + " larger than object count:" + objectList.size()); |
||||
} |
||||
} |
||||
} |
||||
throw new JsonPathException("Aggregation function attempted to calculate value using empty array"); |
||||
} |
||||
|
||||
protected int getIndexFromParameters(EvaluationContext ctx, List<Parameter> parameters) { |
||||
List<Number> numbers = Parameter.toList(Number.class, ctx, parameters); |
||||
return numbers.get(0).intValue(); |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.jayway.jsonpath.internal.function.sequence; |
||||
|
||||
import com.jayway.jsonpath.internal.EvaluationContext; |
||||
import com.jayway.jsonpath.internal.function.Parameter; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Take the first item from collection of JSONArray |
||||
* |
||||
* Created by git9527 on 6/11/22. |
||||
*/ |
||||
public class First extends AbstractSequenceAggregation { |
||||
@Override |
||||
protected int targetIndex(EvaluationContext ctx, List<Parameter> parameters) { |
||||
return 0; |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.jayway.jsonpath.internal.function.sequence; |
||||
|
||||
import com.jayway.jsonpath.internal.EvaluationContext; |
||||
import com.jayway.jsonpath.internal.function.Parameter; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Take the index from first Parameter, then the item from collection of JSONArray by index |
||||
* |
||||
* Created by git9527 on 6/11/22. |
||||
*/ |
||||
public class Index extends AbstractSequenceAggregation { |
||||
@Override |
||||
protected int targetIndex(EvaluationContext ctx, List<Parameter> parameters) { |
||||
return getIndexFromParameters(ctx, parameters); |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.jayway.jsonpath.internal.function.sequence; |
||||
|
||||
import com.jayway.jsonpath.internal.EvaluationContext; |
||||
import com.jayway.jsonpath.internal.function.Parameter; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Take the first item from collection of JSONArray |
||||
* |
||||
* Created by git9527 on 6/11/22. |
||||
*/ |
||||
public class Last extends AbstractSequenceAggregation { |
||||
@Override |
||||
protected int targetIndex(EvaluationContext ctx, List<Parameter> parameters) { |
||||
return -1; |
||||
} |
||||
} |
@ -0,0 +1,53 @@
|
||||
package com.jayway.jsonpath.internal.function; |
||||
|
||||
import com.jayway.jsonpath.Configuration; |
||||
import com.jayway.jsonpath.Configurations; |
||||
import org.junit.Test; |
||||
|
||||
/** |
||||
* Test cases for functions |
||||
* |
||||
* -first |
||||
* -last |
||||
* -index(X) |
||||
* |
||||
* Created by git9527 on 6/11/22. |
||||
*/ |
||||
public class SequentialPathFunctionTest extends BaseFunctionTest { |
||||
|
||||
private Configuration conf = Configurations.JACKSON_CONFIGURATION; |
||||
|
||||
@Test |
||||
public void testFirstOfNumbers() throws Exception { |
||||
verifyFunction(conf, "$.numbers.first()", NUMBER_SERIES, 1); |
||||
} |
||||
|
||||
@Test |
||||
public void testLastOfNumbers() throws Exception { |
||||
verifyFunction(conf, "$.numbers.last()", NUMBER_SERIES, 10); |
||||
} |
||||
|
||||
@Test |
||||
public void testIndexOfNumbers() throws Exception { |
||||
verifyFunction(conf, "$.numbers.index(0)", NUMBER_SERIES, 1); |
||||
verifyFunction(conf, "$.numbers.index(-1)", NUMBER_SERIES, 10); |
||||
verifyFunction(conf, "$.numbers.index(1)", NUMBER_SERIES, 2); |
||||
} |
||||
|
||||
@Test |
||||
public void testFirstOfText() throws Exception { |
||||
verifyFunction(conf, "$.text.first()", TEXT_SERIES, "a"); |
||||
} |
||||
|
||||
@Test |
||||
public void testLastOfText() throws Exception { |
||||
verifyFunction(conf, "$.text.last()", TEXT_SERIES, "f"); |
||||
} |
||||
|
||||
@Test |
||||
public void testIndexOfText() throws Exception { |
||||
verifyFunction(conf, "$.text.index(0)", TEXT_SERIES, "a"); |
||||
verifyFunction(conf, "$.text.index(-1)", TEXT_SERIES, "f"); |
||||
verifyFunction(conf, "$.text.index(1)", TEXT_SERIES, "b"); |
||||
} |
||||
} |
Loading…
Reference in new issue