Sun Java System Portal Server 7 Developer's Guide

Chapter 24 Example of Submitting a Query

This chapter contains the following sections:

Overview of Submitting a Query

To send the RDMHeader and RDMQuery objects to the search engine to perform a query request, you can use the pre-built sendrdm program (located in PortalServer-base/lib directory). This program takes an RDM request (which is a message in SOIF format), sends it to the search engine, and outputs the results as a SOIF stream. You can also use HTTP to post an RDM stream directly to the server through its URL http://server:port/search-ID/search). The program must be run in a search-enabled Sun Java System Portal Server software instance directory such as the default PortalServer-DataDir/searchservers/search1/ directory.

You should also change the definitions for MY_CSID, MY_SCOPE and MY_ATTR_VIEW to suit your needs.

RDMHeader and RDMQuery Object Parameters

The following table describes the RDMHeader and RDMQuery object parameters in the first (left) column and provides a description of the corresponding parameter in the second (right) column


ID of the search engine instance. This parameter specifies the specific search engine that you created in the search engine Administration Interface. You can find the exact value in /var/opt/SUNWportal/searchservers/search1/config/search.conf. For SSL enabled server instances, use x-catalogs instead of x-catalog in the CSID.


Query string. The default is to search for documents containing the string varrius. For example, if you want to search for all documents containing the string style_sheets, then set MY_SCOPE to style_sheets.


Attributes to be printed, such as URL, title and description.

Example 24–1 RDM API to Submit a Query Example

This example generates an RDM for querying a search engine database. You can pipe the output of the sample program to a temporary file and then use the sendrdm program to post it to the search engine.

/******* Example Use of the RDM API to submit a query *******/

#include <stdio.h>
#include “soif.h”
#include “rdm.h”

#define MY_SCOPE “varrius”
#define MY_CSID “x-catalog://”
#define MY_ATTR_VIEW “title,content-type”

int main(int argc, char *argv)
    RDMQuery *myquery = NULL;
    CSID *csid = NULL;
    RDMHeader *myheader = NULL;
    SOIFStream *out = SOIF_PrintInitFile(stdout);

    /* Create the RDMQuery and specify its scope */
    if(!(myquery = RDMQuery_Create(MY_SCOPE))) {

    /* Set the view attributes of the RDMQuery */
    RDMQuery_SetViewAttr(myquery, MY_ATTR_VIEW);

    /* Create the CSID that points to your search engine instance */
    if(!(csid = CSID_Parse(MY_CSID))) {

    /* Create the RDMHeader */
    if(!(myheader = RDMHeader_CreateRequest(RDM_RD_REQ, “search”,
    csid))) {

    /* print the RDMHeader to the output SOIF stream */
    /* print the RDMQuery to the output SOIF stream */
    (*out->print)(out, myheader->soif);
    (*out->print)(out, myquery->soif);

    /* free the structures and exit */

/*********** EOF ****************/

Running the Example

To run the example described in Example 24–1, follow these steps.

ProcedureTo Run the Example

  1. Edit the definitions for MY_SCOPE, MY_CSID, and MY_ATTR_VIEW as appropriate for your situation. For more information, see Running the Example.

  2. Save the file in PortalServer-base/sdk/rdm/examples directory. For example, save the file as example4.c in PortalServer-base/sdk/rdm/examples directory.

  3. Create a makefile. You can find sample makefiles at PortalServer-base/sdk/rdm/examples directory. Edit the makefile to include example4.c. The following shows the makefile with the changes needed for example4.c in bold:

    Makefile for SOIF/RDM examples

    #  Makefile for SOIF/RDM SDK examples
    #  Use make and cc.
    CC              = cc
    SDKDIR          = ..
    SDKLIB          = $(SDKDIR)/lib/librdm.a
    SDKINC          = $(SDKDIR)/include/
    CFLAGS          = -I$(SDKINC) -DXP_UNIX
    CFLAGS          += -DSOLARIS
    #CFLAGS         += -DIRIX
    #CFLAGS         += -DHPUX
    #CFLAGS         += -DAIX
    EXAMPLES        = example1 example2 example3
    all:    $(EXAMPLES)
    $(CC) -o $@ $@.o $(SDKLIB)
    $(CC) -o $@ $@.o $(SDKLIB)
    $(CC) -o $@ $@.o $(SDKLIB)
    $(CC) -o $@ $@.o $(SDKLIB)
  4. From the PortalServer-base/sdk/rdm/examples directory, build the example as follows:

  5. From the PortalServer-base/sdk/rdm/examples directory, run the example4.c program to generate the RDM file.

    example4.c > rdm.soif

    The file rdm.soif will look like the following example:

    @RDMHEADER { -
     rdm-version{3}: 1.0
     rdm-type{10}: rd-request
     rdm-query-language{6}: search
    @RDMQUERY { -
     view-attributes{18}: title,content-type
     scope{5}: varrius

    The file rdm.soif created in must be placed into the server instance directory.

  6. Send the SOIF contained in rdm.soif to the program sendrdm. For example, type:

    ./run-cs-cli sendrdm -u /portal/search rdm.soif

    The current directory should be the server instance directory. If rdm.soif is not in the server instance directory, reference the file from where is was created. For example:

    1. Change directories to server_instace_dir.

    2. Type ./run-cs-cli sendrdm -u /portal/search sdk_dir/rdm.soif.

    3. The results of the sendrdm program will be a SOIF stream containing the results of the query, such as the following example:

      @RDMHEADER { - catalog-service-id{41}:x-catalog:// rdm-version{3}: 1.0 rdm-type{11}: rd-response rdm-response-interpret{51}:20 results out of 36281 hits across 88985 documents } @DOCUMENT { content-type{9}: text/html score{3}: 100 title{17}: Comunicato stampa } @DOCUMENT { content-type{9}: text/html score{3}: 100 title{17}: Comunicato stampa }

      You can pipe the output of sendrdm (which is a SOIFStream) to another program to print the results of the query.