问题描述
我正在使用下面的代码来获取特定设备的最新测量API详细信息,但未按降序返回数据:
import com.cumuLocity.sdk.client.measurement.MeasurementFilter;
import com.cumuLocity.sdk.client.Platform;
import com.cumuLocity.rest.representation.measurement.MeasurementRepresentation;
@Autowired
private Platform platform;
MeasurementFilter filter = new MeasurementFilter().byType("type").bySource("deviceid").byDate(fromDate,dateto);
Iterable<MeasurementRepresentation> mRep = platform.getMeasurementApi().getMeasurementsByFilter(filter).get().elements(1);
List<MeasurementRepresentation> mRepList = StreamSupport.stream(mRep.spliterator(),false).collect(Collectors.toList());
...
我们可以使用Http REST url调用中的'revert = true'获取最新数据。
../measurement/measurements?source={deviceid}&type={type}&dateto=xxx&dateFrom=xxx&revert=true
我们如何使用'revert = true'或其他方式使用CumuLocity Java SDK来获取测量详细信息?感谢您的帮助。
解决方法
SDK当前没有用于还原参数的现成QueryParam,因此您必须自己创建它:
import com.cumulocity.sdk.client.Param;
public class RevertParam implements Param {
@Override
public String getName() {
return "revert";
}
}
然后可以将其与查询组合。因此,当在MeasurementCollection上使用get()时,要包括查询参数。您目前没有传递任何内容,但是可以传递pageSize和任意数量的QueryParam。
private Iterable<MeasurementRepresentation> getMeasurementByFilterAndQuery(int pageSize,MeasurementFilter filter,QueryParam... queryParam) {
MeasurementCollection collection = measurementApi.getMeasurementByFilter(filter);
Iterable<MeasurementRepresentation> iterable = collection.get(pageSize,queryParam).allPages();
return iterable;
}
private Optional<MeasurementRepresentation> getLastMeasurement(GId source) {
QueryParam revertQueryParam = new QueryParam(new RevertParam(),"true");
MeasurementFilter filter = new MeasurementFilter()
.bySource(source)
.byFromDate(new DateTime(0).toDate());
Iterable<MeasurementRepresentation> iterable = measurementRepository.getMeasurementByFilterAndQuery(1,filter,revertQueryParam);
if (iterable.iterator().hasNext()) {
return Optional.of(iterable.iterator().next());
} else {
return Optional.absent();
}
}
扩展代码,如下所示:
QueryParam revertQueryParam = new QueryParam(new RevertParam(),"true");
MeasurementFilter filter = new MeasurementFilter().byType("type").bySource("deviceId").byDate(fromDate,dateTo);
Iterable<MeasurementRepresentation> mRep = platform.getMeasurementApi().getMeasurementsByFilter(filter).get(1,revertQueryParam);
List<MeasurementRepresentation> mRepList = StreamSupport.stream(mRep.spliterator(),false).collect(Collectors.toList());
您对元素所做的操作是正确的,但这并不限制API调用仅返回一个值。它将使用defaultPageSize(= 5)查询,然后在Iterable级别将其限制为仅返回一个。当您需要比maxPageSize(= 2000)更多的元素时,elements()函数更适合使用。然后它将处理自动请求其他页面,您可以遍历Iterable。