如何使用 Java SDK for Cumulocity Api 中的 MeasurementFilter 反转测量数据?

how to reverse the measurement data using MeasurementFilter in Java SDK for Cumulocity Api?

我正在使用以下代码获取特定设备的最新测量 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());
...

MeasurementFilter api

我们可以在 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 调用限制为仅 return 一个值。它将使用 defaultPageSize (=5) 进行查询,然后在 Iterable 级别将其限制为仅 return 一个。当您需要比 maxPageSize (=2000) 更多的元素时,elements() 函数更适合使用。然后它将处理对其他页面的自动请求,您可以循环遍历 Iterable。