我有一个Java对象Record。它代表SQL执行的一条记录。 CQEngine可以索引Record的集合吗?

我班的形式是

public class Record {
    private List<String> columnNames;
    private List<Object> values;

    ... Other getters
}


我看了一些例子,但是我没有运气。

我只想索引具有名称和相应值的特定列。可以使用cqengine实现此功能,还是有其他替代方法可以实现这一点。

谢谢。

最佳答案

这似乎是对数据建模的一种奇怪方法,但是您可以根据需要将CQEngine与该模型一起使用。

(首先,CQEngine将不使用您的列名,因此您可以删除该字段。)

为此,您将需要为值列表中的每个索引定义一个CQEngine virtual attribute

每个属性都需要使用存储在该列/索引中的数据类型声明,并且需要能够将值列表中该索引处的对象强制转换为适当的数据类型(StringDoubleInteger等)。

因此,假设您的Record有一个名为'price'的列,其类型为Double,并存储在值列表中的索引5处。您可以定义一个如下读取的属性:

public static final Attribute<Record, Double> PRICE =
    attribute("PRICE", record -> ((Double) record.values.get(5));


如果这听起来很复杂,那是因为建模数据的方式使事情有些复杂:)使用利用Java类型系统的数据模型通常更容易(而您的模型则没有)。因此,您需要自己以编程方式跟踪每个字段的数据类型等。

但是CQEngine本身可以在该模型上正常工作,因为最终,CQEngine属性不需要读取字段,这些属性只是编程为获取值的函数。

有很多上面没有提到的东西。例如,您的值可以为null吗? (如果是这样,您应该使用CQEngine docs中讨论的可为空的各种属性。或者,每个Record对象是否可能具有不同的列集?(如果是这样,则可以在以下情况下即时创建属性)您会遇到一个新列,但您可能应该将创建的属性缓存在某处)。

希望能有所帮助,
Niall(CQEngine作者)

09-28 06:13