/********************************************************** NAME : DetermineQueryTemplates DESCRIPTION : Builds a list of templates to be used in fact queries - uses parse form. INPUTS : 1) The parse template expression chain 2) The name of the function being executed 3) Caller's buffer for restriction count (# of separate lists) RETURNS : The query list, or NULL on errors SIDE EFFECTS : Memory allocated for list Busy count incremented for all templates NOTES : Each restriction is linked by nxt pointer, multiple templates in a restriction are linked by the chain pointer. Rcnt caller's buffer is set to reflect the total number of chains Assumes templateExp is not NULL and that each restriction chain is terminated with the QUERY_DELIMITER_SYMBOL "(QDS)" **********************************************************/ static QUERY_TEMPLATE *DetermineQueryTemplates( Environment *theEnv, Expression *templateExp, const char *func, unsigned *rcnt) { QUERY_TEMPLATE *clist = NULL, *cnxt = NULL, *cchain = NULL, *tmp; bool new_list = false; UDFValue temp; Deftemplate *theDeftemplate; *rcnt = 0; while (templateExp != NULL) { theDeftemplate = NULL; if (templateExp->type == DEFTEMPLATE_PTR) { theDeftemplate = (Deftemplate *) templateExp->value; } else if (EvaluateExpression(theEnv,templateExp,&temp)) { DeleteQueryTemplates(theEnv,clist); return NULL; } if ((theDeftemplate == NULL) && (temp.value == (void *) FactQueryData(theEnv)->QUERY_DELIMITER_SYMBOL)) { new_list = true; (*rcnt)++; } else if ((tmp = FormChain(theEnv,func,theDeftemplate,&temp)) != NULL) { if (clist == NULL) { clist = cnxt = cchain = tmp; } else if (new_list == true) { new_list = false; cnxt->nxt = tmp; cnxt = cchain = tmp; } else { cchain->chain = tmp; } while (cchain->chain != NULL) { cchain = cchain->chain; } } else { SyntaxErrorMessage(theEnv,"fact-set query class restrictions"); DeleteQueryTemplates(theEnv,clist); SetEvaluationError(theEnv,true); return NULL; } templateExp = templateExp->nextArg; } return clist; }
/********************************************************** NAME : DetermineQueryClasses DESCRIPTION : Builds a list of classes to be used in instance queries - uses parse form. INPUTS : 1) The parse class expression chain 2) The name of the function being executed 3) Caller's buffer for restriction count (# of separate lists) RETURNS : The query list, or NULL on errors SIDE EFFECTS : Memory allocated for list Busy count incremented for all classes NOTES : Each restriction is linked by nxt pointer, multiple classes in a restriction are linked by the chain pointer. Rcnt caller's buffer is set to reflect the total number of chains Assumes classExp is not NULL and that each restriction chain is terminated with the QUERY_DELIMITER_SYMBOL "(QDS)" **********************************************************/ static QUERY_CLASS *DetermineQueryClasses( void *theEnv, EXEC_STATUS, EXPRESSION *classExp, char *func, unsigned *rcnt) { QUERY_CLASS *clist = NULL,*cnxt = NULL,*cchain = NULL,*tmp; int new_list = FALSE; DATA_OBJECT temp; *rcnt = 0; while (classExp != NULL) { if (EvaluateExpression(theEnv,execStatus,classExp,&temp)) { DeleteQueryClasses(theEnv,execStatus,clist); return(NULL); } if ((temp.type == SYMBOL) && (temp.value == (void *) InstanceQueryData(theEnv,execStatus)->QUERY_DELIMETER_SYMBOL)) { new_list = TRUE; (*rcnt)++; } else if ((tmp = FormChain(theEnv,execStatus,func,&temp)) != NULL) { if (clist == NULL) clist = cnxt = cchain = tmp; else if (new_list == TRUE) { new_list = FALSE; cnxt->nxt = tmp; cnxt = cchain = tmp; } else cchain->chain = tmp; while (cchain->chain != NULL) cchain = cchain->chain; } else { SyntaxErrorMessage(theEnv,execStatus,"instance-set query class restrictions"); DeleteQueryClasses(theEnv,execStatus,clist); SetEvaluationError(theEnv,execStatus,TRUE); return(NULL); } classExp = classExp->nextArg; } return(clist); }
/********************************************************** NAME : DetermineQueryTemplates DESCRIPTION : Builds a list of templates to be used in fact queries - uses parse form. INPUTS : 1) The parse template expression chain 2) The name of the function being executed 3) Caller's buffer for restriction count (# of separate lists) RETURNS : The query list, or NULL on errors SIDE EFFECTS : Memory allocated for list Busy count incremented for all templates NOTES : Each restriction is linked by nxt pointer, multiple templates in a restriction are linked by the chain pointer. Rcnt caller's buffer is set to reflect the total number of chains Assumes classExp is not NULL and that each restriction chain is terminated with the QUERY_DELIMITER_SYMBOL "(QDS)" **********************************************************/ static QUERY_TEMPLATE *DetermineQueryTemplates( void *theEnv, EXPRESSION *templateExp, char *func, unsigned *rcnt) { QUERY_TEMPLATE *clist = NULL,*cnxt = NULL,*cchain = NULL,*tmp; int new_list = FALSE; DATA_OBJECT temp; *rcnt = 0; while (templateExp != NULL) { if (EvaluateExpression(theEnv,templateExp,&temp)) { DeleteQueryTemplates(theEnv,clist); return(NULL); } if ((temp.type == SYMBOL) && (temp.value == (void *) FactQueryData(theEnv)->QUERY_DELIMETER_SYMBOL)) { new_list = TRUE; (*rcnt)++; } else if ((tmp = FormChain(theEnv,func,&temp)) != NULL) { if (clist == NULL) clist = cnxt = cchain = tmp; else if (new_list == TRUE) { new_list = FALSE; cnxt->nxt = tmp; cnxt = cchain = tmp; } else cchain->chain = tmp; while (cchain->chain != NULL) cchain = cchain->chain; } else { SyntaxErrorMessage(theEnv,"fact-set query class restrictions"); DeleteQueryTemplates(theEnv,clist); SetEvaluationError(theEnv,TRUE); return(NULL); } templateExp = templateExp->nextArg; } return(clist); }