C example--value set queries


The example shows you how to use a value set query and update an existing code to use the groupBy and having clauses and related structures. Lines with required code changes are marked with //.

For information about using the groupBy and having clauses and the related aggregate functions, see Using-aggregate-functions-groupBy-clauses-and-having-clauses.

In the following example, the login user name is InSubqueryUser. The query operates on the InSubqueryPermissions1 form and performs the IN subquery on the InSubqueryPermissions3 form. The example assumes that both forms are populated with the appropriate data. 


void queryUsingSubquery(unsigned int IN_NOT_IN_op,
   ARControlStruct *ctrl, ARStatusList *status)
{
   ARMultiSchemaFieldFuncValueListList msEntryList = {0, NULL};  /**/
   unsigned int numMatches;
   unsigned int *numMatchesPtr;
   int result;
   ARMultiSchemaFuncQueryFromList fromList = {0, NULL};  /**/
   ARMultiSchemaSortList sortList = {0, NULL};
   ARMultiSchemaFieldFuncList getListFields = {0, NULL};  /**/
   ARMultiSchemaFuncQueryFromStruct perm1fromItem = {0,}; /* 0-fill */ /**/
   ARMultiSchemaFuncQueryFromStruct perm3fromItem = {0,}; /* 0-fill */ /**/
   ARMultiSchemaQualifierStruct joinQual = {AR_COND_OP_NONE, NULL};
   ARMultiSchemaQualifierStruct qualifier = {AR_COND_OP_NONE, NULL};
   ARMultiSchemaRelOpStruct relop;
   ARMultiSchemaFieldFuncStruct fieldIdMain[4] = {{"",}};  /* 0-fill */ /**/
   ARMultiSchemaValueSetFuncQueryStruct valueSetQuery = {{0,}}; /* 0-fill *//**/
   /* fill up query struct */
   fromList.numItems = 1;
   fromList.listPtr = &perm1fromItem;
   strcpy(fieldIdMain[0].queryFromAlias, "perm1");
   fieldIdMain[0].fieldId = 1; /*requestId */
   fieldIdMain[0].funcId = AR_MULTI_SCHEMA_FUNC_NONE;  /**/
   strcpy(fieldIdMain[1].queryFromAlias, "perm1");
   fieldIdMain[1].fieldId = 536870913; /* char field */
   fieldIdMain[1].funcId = AR_MULTI_SCHEMA_FUNC_NONE;  /**/
   strcpy(fieldIdMain[2].queryFromAlias, "perm1");
   fieldIdMain[2].funcId = AR_MULTI_SCHEMA_FUNC_NONE;  /**/
   fieldIdMain[2].fieldId = 536870914; /* integer field */
   getListFields.numItems = 3;
   getListFields.listPtr = fieldIdMain;  /**/
   /* perm1fromItem from item */
   perm1fromItem.type = AR_MULTI_SCHEMA_SCHEMA_NAME;
   strcpy(perm1fromItem.u.schemaName, "InSubqueryPermissions1");
   perm1fromItem.joinType = 0;
   perm1fromItem.joinQual = NULL;
   strcpy(perm1fromItem.queryFromAlias, "perm1");
   /* perm3fromItem from item */
   perm3fromItem.type = AR_MULTI_SCHEMA_SCHEMA_NAME;
   strcpy(perm3fromItem.u.schemaName, "InSubqueryPermissions4");
   perm3fromItem.joinType = 0;
   perm3fromItem.joinQual = NULL;
   strcpy(perm3fromItem.queryFromAlias, "perm3");
   numMatchesPtr = &numMatches;
   /* main query qualifier */
   qualifier.operation = AR_COND_OP_REL_OP;
   qualifier.u.relOp = &relop;
   relop.operation = IN_NOT_IN_op;
   relop.operandLeft.tag = AR_FIELD;
   strcpy(relop.operandLeft.u.fieldId.queryFromAlias, "perm1");
   relop.operandLeft.u.fieldId.fieldId = 536870913;
   relop.operandRight.tag = AR_VALUE_SET_QUERY;
   relop.operandRight.u.valueSetQuery = &valueSetQuery;
   /* set value set query now */
   valueSetQuery.queryFromList.numItems = 1;
   valueSetQuery.queryFromList.listPtr = &perm3fromItem;
   valueSetQuery.fieldId.fieldId = 536870913;
   strcpy(valueSetQuery.fieldId.queryFromAlias, "perm3");
   valueSetQuery.qualifier = NULL;
   result = ARGetListEntryWithMultiSchemaFields (ctrl, &fromList,
         &getListFields, &qualifier, &sortList, AR_START_WITH_FIRST_ENTRY,
         AR_NO_MAX_LIST_RETRIEVE, FALSE,
         NULL, NULL,  /* groupBy, having */
         &msEntryList, numMatchesPtr, status);
}


 

Tip: For faster searching, add an asterisk to the end of your partial query. Example: cert*