每次比较都是 QueryFilterNode 对象的一个实例,由过滤器实施。过滤器允许您将一个字段与单一值或某个范围内的多个值进行比较。为过滤器选择的运算符确定要执行的比较类型。 要获取有效运算符的列表,请参阅 CompOp 常量枚举类型。要创建过滤器的分层树,请使用布尔运算符将它们连接在一起,并可以将某些过滤器嵌套在另一些过滤器中。 每个过滤器包含单一条件,或使用 AND 或 OR 运算符连接在一起的一组条件。在构建自己的过滤器时,您可以嵌套多组更为复杂的过滤器,以创建一组复杂的搜索逻辑。
设计查询时,您可以使用以上列出的方法,如下所示:
以下示例包含一些查询过滤器,扩展了前一主题中的示例:
use CQPerlExt;
#Start a Rational ClearQuest session
$SessionObj = CQSession::Build();
$dbsetname = "CQMS.SAMPL.HOME";
#Refresh list of accessible databases
$databases = $SessionObj->GetAccessibleDatabases("MASTR", "", $dbsetname);
#Log into a database
$SessionObj->UserLogon("admin","","SAMPL",$dbsetname);
#Create a Query
$querydef = $SessionObj->BuildQuery("defect");
$querydef->BuildField("id");
$querydef->BuildField("headline");
$querydef->BuildField("owner.login_name");
$querydef->BuildField("submit_date");
#Create the queryfilternode object:
# where (state is not Closed AND (id = 1 OR id = 2))
$where = $querydef->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_AND);
# All filter values passed in as a reference to an array.
@states = ("closed");
$where->BuildFilter("state", $CQPerlExt::CQ_COMP_OP_NEQ, \@states);
# Another way to pass the array reference for simple values is using an anonymous array, like this:
# $where->BuildFilter("state", $CQPerlExt::CQ_COMP_OP_EQ, ["closed"]);
$subor = $where->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_OR);
@id1 = ("SAMPL00000001");
$subor->BuildFilter("id", $CQPerlExt::CQ_COMP_OP_EQ, \@id1);
@id2 = ("SAMPL00000002");
$subor->BuildFilter("id", $CQPerlExt::CQ_COMP_OP_EQ, \@id2);
$resultset = $SessionObj->BuildResultSet($querydef);
$ct = $resultset->ExecuteAndCountRecords();
for ($i = 0; $i < $ct; $i++) {
$resultset->MoveNext();
print $resultset->GetColumnValue(1);
print " ";
print $resultset->GetColumnValue(2);
print " ";
print $resultset->GetColumnValue(3);
print " ";
print $resultset->GetColumnValue(4);
print "\n";
}
CQSession::Unbuild($SessionObj);