Per definire i criteri di ricerca di una query si utilizzano i filtri della query, che si basano sui confronti con i campi di ciascun record in un database utente. La
query restituisce tutti i campi di un database che corrispondono ai criteri di ricerca in un oggetto ResultSet.
Ogni confronto viene implementato da un filtro, che è un'istanza dell'oggetto QueryFilterNode. Un filtro consente di confrontare un campo con un valore singolo o un intervallo di valori. L'operatore selezionato per il filtro determina il tipo di confronto da eseguire.
Per un elenco di operatori validi, consultare il tipo di costanti CompOp elencate. Per creare una struttura gerarchica dei filtri, unirli con un operatore booleano e nidificare alcuni filtri dentro altri filtri.
Ogni filtro è costituito da una condizione singola o un gruppo di condizioni unite con un operatore AND o OR. Quando i filtri vengono creati, è possibile nidificare gruppi più complessi di filtri per creare una complessa serie di logica di ricerca.
Quelli indicati di seguito sono gli oggetti più comunemente utilizzati per la creazione di query, e i relativi metodi:
- Oggetto QueryDef:
- BuildQuery (tipo record) - per una nuova query per un dato tipo di record.
- BuildField (per specificare i campi da visualizzare).
- Il metodo BuildFilterOperator richiede la costante BoolOpConstant
(And/Or).
- Oggetto Session:
- Metodo BuildResultSet (segnaposto di dati richiamati da una query).
- Oggetto ResultSet:
- Metodo BuildResultSet (segnaposto di dati richiamati da una query).
- Metodo Execute (esegue la query e richiama i dati risultanti).
- Metodo MoveNext (sposta il cursore sul successivo record nella serie di dati).
- Metodo GetColumnLabel (ottiene il testo dell'etichetta del campo) - ad esempio, "Intestazione",
"id", "Stato")
- Metodo GetColumnValue (ottiene i dati specifici del campo) - ad esempio, "SAMPL00000014",
"Questa è l'intestazione", "Inoltrato"
- Oggetto QueryFilterNode:
- BuildFilter (parametri filtro) richiede un operatore di confronto (ad esempio
In, Uguale a, Minore di, Maggiore di, È null) che sia una costante CompOpConstant (ad esempio EQ, NEQ, GT, GTE, LT, LTE) e valori rispetto ai quali effettuare il confronto (ad esempio, Stato EQ Inoltrato), oltre a un array stringa Perl contenente i valori da confrontare con i valori nel campo specificato.
- Il metodo BuildFilterOperator richiede la costante BoolOpConstant
Quando si progetta una query, è possibile utilizzare i metodi sopra indicati nel seguente modo:
- Utilizzare il metodo BuildQueryDef per creare un oggetto QueryDef: $QueryDef
= $Session->BuildQueryDef(entity-def-name)
- Aggiungere i campi da selezionare con il metodo BuildField: $QueryDef->BuildField(field-name)
- Creare filtri di query come una struttura ad albero And/Or. I nodi And/Or sono oggetti QueryFilterNode. Utilizzare il metodo BuildFilterOperator
per costruire il primo nodo della struttura ad albero: $QueryFilterNode =
$QueryDef->BuildFilterOperator(bool)
- Aggiungere nodi di confronto And/Or come figli di un oggetto QueryFilterNode con i seguenti metodi: QueryFilterNode = $QueryFilterNode->BuildFilter(field,CompOp,value) e $QueryFilterNode->BuildFilterOperator(bool) Ad esempio, per filtrare in base alla priorità = 1 e
(componente = gui o proprietario = joe):
$and_node = $querydef->BuildFilterOperator(And);
$and_node->BuildFilter("priority",eq,1);
$or_node = $and_node->BuildFilterOperator(Or);
# Il terzo argomento del metodo BuildFilter deve essere un riferimento a un array:
# Qui prima si crea l'array @comp, poi si passa
# il riferimento \@comp al metodo BuildFilter.
@comp = ("gui");
$or_node->BuildFilter("component", $CQPerlExt::CQ_COMP_OP_EQ, \@comp);
@name = ("Joe");
$or_node->BuildFilter("owner", $CQPerlExt::CQ_COMP_OP_EQ, \@name);
# Un altro modo per passare il riferimento array per valori semplici è usare array anonimi. Ad esempio:
$or_node->BuildFilter("owner", $CQPerlExt::CQ_COMP_OP_EQ, ["Joe"]);
Esempio
Questo esempio estende quello nell'argomento precedente includendo alcuni filtri di query:
use CQPerlExt;
#Avviare una sessione Rational ClearQuest
$SessionObj = CQSession::Build();
$dbsetname = "CQMS.SAMPL.HOME";
#Aggiornare l'elenco di database accessibili
$databases = $SessionObj->GetAccessibleDatabases("MASTR", "", $dbsetname);
#Accedere a un database
$SessionObj->UserLogon("admin","","SAMPL",$dbsetname);
#Creare una query
$querydef = $SessionObj->BuildQuery("defect");
$querydef->BuildField("id");
$querydef->BuildField("headline");
$querydef->BuildField("owner.login_name");
$querydef->BuildField("submit_date");
#Creare l'oggetto queryfilternode:
# dove (stato non è Chiuso AND (id = 1 OR id = 2))
$where = $querydef->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_AND);
# Tutti i valori filtro passati come riferimento a un array.
@states = ("closed");
$where->BuildFilter("state", $CQPerlExt::CQ_COMP_OP_NEQ, \@states);
# Un altro modo per passare il riferimento array per valori semplici è usare un array anonimo, ad esempio:
# $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);