IBM webMethods Hybrid Integration

IBM webMethods Hybrid Integration

Join this online group to communicate across IBM product users and experts by sharing advice and best practices with peers and staying up to date regarding product enhancements.


#TechXchangePresenter
 View Only
Expand all | Collapse all

Sorting of DocumentList using one of the fields as a key

  • 1.  Sorting of DocumentList using one of the fields as a key

    Posted Mon June 06, 2005 06:49 AM

    Hello

    I have a documentList with following structure:

    -Document
    -field1
    -field2.

    I would like to Sort this document list using field1/field2 as the key. Would someone know the code for doing this.

    Cheers

    Sam.


    #Integration-Server-and-ESB
    #webMethods


  • 2.  RE: Sorting of DocumentList using one of the fields as a key

    Posted Tue June 07, 2005 12:17 AM

    Refer to the Java documents (<install_directory>\Developer\doc\API\Java):

    com.wm.data.IDataUtil - sortIDataArrayByKey

    Code Snippet:

    ***
    public static final void sortIDataDocsValues (IData pipeline)
    throws ServiceException
    {
    // --- <> ---
    // @subtype unknown
    // @sigtype java 3.5
    // [i] field:0:required keyField
    // [i] field:0:required datePattern {"dd/MM/yyyy kk:mm:ss.s"}
    // [i] field:0:required sortDescending {"true","false"}
    // [i] record:1:required values
    // [o] record:1:required sortedValues
    // [o] field:0:required sorted
    IData[] sortedItemList = null; 
    
    // pipeline 
    IDataCursor pipelineCursor = pipeline.getCursor(); 
    IDataCursor pipelineCursor1 = pipeline.getCursor(); 
    IData[] itemList = IDataUtil.getIDataArray( pipelineCursor, "values" ); 
    
    int N = itemList.length; 
    IData[] itemListClone = new IData[N]; 
    try { 
    
    if (itemList != null) 
    { 
    for (int i=0;i<itemList.length;i++) 
    if (itemList[i] != null) 
    itemListClone[i] = IDataUtil.deepClone(itemList[i]); 
    } 
    String keyField = IDataUtil.getString( pipelineCursor, "keyField" ); 
    boolean sortDescending = (Boolean.valueOf(IDataUtil.getString( pipelineCursor, "sortDescending" ))).booleanValue(); 
    pipelineCursor.destroy(); 
    
    if(itemList != null) 
    { 
    String pattern = IDataUtil.getString( pipelineCursor, "datePattern" ); 
    if (pattern != null)
    {
    sortedItemList = IDataUtil.sortIDataArrayByKey(itemListClone,keyField, 
    IDataUtil.COMPARE_TYPE_TIME, pattern, sortDescending); 
    }
    else
    {
    sortedItemList = IDataUtil.sortIDataArrayByKey(itemListClone,keyField, 
    IDataUtil.COMPARE_TYPE_COLLATION, null,sortDescending); 
    }
    } 
    }catch (IOException e) {} 
    
    // pipeline 
    pipelineCursor = pipeline.getCursor(); 
    IDataUtil.put( pipelineCursor, "sorted", sortedItemList==null ? "false" : "true"); 
    IDataUtil.put( pipelineCursor,"sortedValues",itemListClone); 
    pipelineCursor.destroy(); 
    
    // --- <> ---
    
    
    
    ***
    

    #webMethods
    #Integration-Server-and-ESB


  • 3.  RE: Sorting of DocumentList using one of the fields as a key

    Posted Tue June 07, 2005 06:59 AM

    Thank you very much for the reply. I tried this code and it works only if I use the field at the highest level as the key. If use field1\field2(ie try to sort on a key at a lower level, it does not work.

    I would appreciate any more suggestions or clues.

    Cheers

    Sam


    #webMethods
    #Integration-Server-and-ESB


  • 4.  RE: Sorting of DocumentList using one of the fields as a key

    Posted Tue June 07, 2005 09:51 AM

    Here is a code that we have used for sorting a document list based on a key field :

    Inputs : itemList, keyField, fields, sortDescending, type
    Output: itemList, sorted
    This service takes as input an ‘itemList’ to be sorted according to the ‘keyField’.
    ‘fields’ are the fields in the list.
    If ‘sortDescending’ is true then it sorts it in descending order else in ascending order.
    ‘type’ is whether we have to sort on Numeric or String field. (Time can be added in a manner similar to String - see API)

    synchronized(class name) 
    
    { 
    
    try 
    { 
    
    IData[] sortedItemList = null; 
    
    // pipeline 
    IDataCursor pipelineCursor = pipeline.getCursor(); 
    IData[] itemList = IDataUtil.getIDataArray( pipelineCursor, "itemList" ); 
    String keyField = IDataUtil.getString( pipelineCursor, "keyField" ); 
    String [] fields = IDataUtil.getStringArray( pipelineCursor, "fields"); 
    String type = IDataUtil.getString( pipelineCursor, "type"); 
    
    boolean sortDescending = (Boolean.valueOf(IDataUtil.getString( pipelineCursor, "sortDescending" ))).booleanValue(); 
    pipelineCursor.destroy(); 
    
    String tmpPipelineValue = "";         
    
    if(itemList != null) 
    {                   
    if(type.equals("String")) 
    {                 
    sortedItemList = IDataUtil.sortIDataArrayByKey(itemList, keyField, IDataUtil.COMPARE_TYPE_COLLATION, null, sortDescending); 
    } 
    
    else if(type.equals("Numeric")) 
    { 
    for(int i=0; i<(itemList.length); i++) 
    { 
    IDataCursor tmpCursor = itemList[i].getCursor(); 
    tmpPipelineValue = IDataUtil.getString(tmpCursor,keyField); 
    double num1; 
    
    Double d = Double.valueOf(tmpPipelineValue); 
    num1 = d.doubleValue(); 
    for(int j= i+1; j<(itemList.length); j++) 
    { 
    IDataCursor tmpCursor1 = itemList[j].getCursor(); 
    tmpPipelineValue = IDataUtil.getString(tmpCursor1, keyField); 
    double num2; 
    
    d = Double.valueOf(tmpPipelineValue); 
    num2 = d.doubleValue(); 
    if(sortDescending) 
    { 
    
    if(num2 > num1) 
    { 
    IData tmpObj = IDataFactory.create(); 
    IDataUtil.copy( itemList[i], tmpObj); 
    
    for(int fd=0; fd < fields.length; fd++) 
    {
    IDataUtil.remove(tmpCursor, fields[fd]); 
    } 
    IDataUtil.copy( itemList[j], itemList[i]); 
    tmpCursor = itemList[i].getCursor(); 
    tmpPipelineValue = IDataUtil.getString(tmpCursor, keyField); 
    d = Double.valueOf(tmpPipelineValue); 
    num1 = d.doubleValue(); 
    
    for(int fd=0; fd < fields.length; fd++) 
    { 
    IDataUtil.remove(tmpCursor1, fields[fd]); 
    } 
    IDataUtil.copy( tmpObj, itemList[j]); 
    } 
    } 
    else 
    { 
    if(num2 < num1) 
    { 
    IData tmpObj = IDataFactory.create(); 
    IDataUtil.copy( itemList[i], tmpObj); 
    
    for(int fd=0; fd < fields.length; fd++) 
    {
    IDataUtil.remove(tmpCursor, fields[fd]); 
    } 
    IDataUtil.copy( itemList[j], itemList[i]); 
    tmpCursor = itemList[i].getCursor(); 
    tmpPipelineValue = IDataUtil.getString(tmpCursor, keyField); 
    d = Double.valueOf(tmpPipelineValue); 
    num1 = d.doubleValue(); 
    
    for(int fd=0; fd < fields.length; fd++) 
    {
    IDataUtil.remove(tmpCursor1, fields[fd]); 
    } 
    IDataUtil.copy( tmpObj, itemList[j]); 
    } 
    } 
    } 
    } 
    
    } 
    
    } 
    // pipeline 
    pipelineCursor = pipeline.getCursor(); 
    if(type.equals("String")) 
    {
    IDataUtil.put( pipelineCursor,     "sorted", sortedItemList==null ? "FALSE" : "TRUE"); 
    } 
    else if(type.equals("Numeric")) 
    {
    IDataUtil.put( pipelineCursor, "sorted", "TRUE"); 
    } 
    //IDataUtil.put( pipelineCursor,     "itemList", itemList); 
    pipelineCursor.destroy(); 
    } 
    
    catch(Exception ex) 
    
    { 
    throw(new ServiceException(ex.toString())); 
    
    } 
    
    
    } 
    

    HTH,

    Anant


    #webMethods
    #Integration-Server-and-ESB


  • 5.  RE: Sorting of DocumentList using one of the fields as a key

    Posted Fri February 29, 2008 07:44 PM