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

问题描述

我正在使用下面的代码获取特定设备的最新测量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调用仅返回一个值。它将使用defaultPageSize(= 5)查询,然后在Iterable级别将其限制为仅返回一个。当您需要比maxPageSize(= 2000)更多的元素时,elements()函数更适合使用。然后它将处理自动请求其他页面,您可以遍历Iterable。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...