Changeset 5559 for TI01-discovery


Ignore:
Timestamp:
04/08/09 22:46:15 (10 years ago)
Author:
sdonegan
Message:

Updated to allow ordering by end date and to handle nulls when ordering by start or end date or other possible null fields

Location:
TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/DBProperties.java

    r5055 r5559  
    3434        public static final String OFFSET_STATEMENT = " OFFSET "; 
    3535        public static final String ORDERBY_STATEMENT = " ORDER BY "; 
     36         
     37        //Have to come up with a way of constructing this involved bit of sql, and then integrating it - easiest way is to do a basic replace i.e. replace INTCOLUMN with resultset_count etc 
     38        public static final String nonNull_ORDERBY_STATEMENT_tstamp(String colName){     
     39                return "(case WHEN INTCOLUMN IS NULL then (select current_timestamp) ELSE (select min(INTCOLUMN) from original_document) END), INTCOLUMN".replace("INTCOLUMN", colName);                 
     40        } 
     41         
     42        public static final String nonNull_ORDERBY_STATEMENT_int(String colName){ 
     43                return "(case WHEN INTCOLUMN IS NULL then (select max(INTCOLUMN) from original_document) ELSE (select min(INTCOLUMN) from original_document) END), INTCOLUMN".replace("INTCOLUMN", colName); 
     44        } 
     45         
     46        //to sort problems with nulls appearing at the top of the ordered list had to append a new orderBy syntax of form: 
     47        // ORDER BY (case WHEN dataset_start_date_nom IS NULL then (select current_timestamp) ELSE (select min(dataset_start_date_nom) from original_document) END), dataset_start_date_nom 
    3648 
    37         public static final String START_TIME = "start_time"; 
     49        public static final String START_TIME = "dataset_start_date_nom"; 
     50         
     51        public static final String END_TIME = "dataset_end_date_nom"; 
    3852 
    3953        public static final String DISCOVERY_ID = "discovery_id"; 
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/DiscoveryServiceSkeleton.java

    r5488 r5559  
    99import java.util.Vector; 
    1010import org.apache.log4j.Logger; 
    11  
     11import java.math.BigDecimal; 
    1212import com.sun.xml.bind.v2.TODO; 
    1313 
     
    6060        public static final String INVALID_LIST_NAME_MESSAGE = "Invalid list name: please use getListNames to get the valid list names"; 
    6161 
    62          
     62        public static final String DATE_ORDER_START = "datasetStartDate"; 
     63         
     64        public static final String DATE_ORDER_END = "datasetEndDate"; 
    6365 
    6466        public static final String DATACENTRE_ORDER = "dataCentre"; 
    65          
    66         public static final String DATE_ORDER = "date"; 
    6767         
    6868        //add in extra ordering options 
     
    249249                if (requestContent.isSetOrderBy()) { 
    250250                        logger.info("Results ordered by: " + requestContent.getOrderBy()); 
     251                         
     252                        //if ordering by proximity and no spatial data input, then must "convert" to spatial search 
     253                        //at this stage must work out whether a true spatial search or not before SearchAgent and isSpatialSearch method is available                    
     254                        if  ((requestContent.getOrderBy().equals(PROXIMITY_ORDER)) && (!(requestContent.isSetBoundingBox()))) { 
     255                                 
     256                                logger.info("Adding global bounding box data to AID proximity ordering where no spatial data input"); 
     257                                 
     258                                //note due to original fudge when dealing with coords and detection of spatial search, set arbritrary bbox to similar to global.. 
     259                                agent.setLimitWest(new BigDecimal ("-178")); 
     260                                agent.setLimitSouth(new BigDecimal ("-88")); 
     261                                agent.setLimitEast(new BigDecimal ("178")); 
     262                                agent.setLimitNorth(new BigDecimal ("88")); 
     263                                 
     264                                //also need to set a spatial operator    
     265                                logger.info("Adding arbritrary spatial operator: " + OVERLAPS_OPERATOR_TYPE); 
     266                                agent.setSpatialOperator(OVERLAPS_OPERATOR_TYPE); 
     267                                                         
     268                        }                        
     269                         
    251270                        agent.setOrderByField(requestContent.getOrderBy().toString()); 
    252271                        if (requestContent.isSetOrderByDirection()) { 
     
    385404                                                 
    386405                                                //if search term found in xml doc, add it to the vector.  If not, remove that doc from the list in the first place 
    387                                                 //logger.info("Document name: " + thisDocNameID + " search term: " + Utilities.resultSetCheckString(requestedFormat, thisDocNameID)); 
    388                                                  
     406                                                logger.info("Document name: " + thisDocNameID + " search term: " + Utilities.resultSetCheckString(requestedFormat, thisDocNameID)); 
    389407                                                if (idOccurs) { 
    390                                                         //logger.info("Match found  using search term:" + Utilities.resultSetCheckString(requestedFormat, thisDocNameID)); 
     408                                                        logger.info("Match found  using search term:" + Utilities.resultSetCheckString(requestedFormat, thisDocNameID)); 
    391409                                                        rearrangedDocsVector.add(xmlDocAsString); 
    392                                                 } /*else { 
     410                                                } else { 
    393411                                                        logger.error("COULD NOT SYNCHRONISE SQL RESULTS WITH KNOWN DOC_ID!!!"); 
    394                                                 }*/ 
     412                                                } 
    395413 
    396414                                        } 
     
    401419                                logger.info("Number in rearrangedDocsVector: " + rearrDocsSize.toString()); 
    402420                                logger.info("Number in resultDocuments: " + resDocsSize.toString()); 
    403                                  
    404                                  
     421 
    405422                                // swap the comment-outs below to revert to pre-update for easy testing! 
    406423                                //Iterator it = resultDocuments.iterator(); 
     
    468485                        // list.addListMember("moles"); 
    469486                } else if (requestContent.getListName().equals("orderByFieldList")) { 
    470                          
    471                         list.addListMember(TEXT_RELEVANCE_ORDER); 
    472                         list.addListMember(DATE_ORDER); 
     487                        list.addListMember(DATE_ORDER_START); 
     488                        list.addListMember(DATE_ORDER_END); 
    473489                        list.addListMember(DATACENTRE_ORDER); 
    474490                        list.addListMember(DATASET_LINKED_POPULARITY); 
     
    478494                        list.addListMember(DATASET_UPDATE_ORDER); 
    479495                        list.addListMember(DATASET_ORDER); 
    480                          
     496                        list.addListMember(TEXT_RELEVANCE_ORDER); 
    481497                         
    482498                } else if (requestContent.getListName().equals("scopeList")) { 
     
    585601                return statementStringBuild; 
    586602        } 
     603         
     604         
    587605 
    588606} 
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/PostgresDBClient.java

    r5031 r5559  
    7171            { 
    7272                //load the driver 
    73                 logger.info("Loading JDBC driver for postgres"); 
     73                logger.info("Loading JDBC driver for postgres " + connectionString); 
    7474                Class.forName("org.postgresql.Driver"); 
    7575                } 
    7676            catch (ClassNotFoundException e)  
    7777            { 
    78                 String errorMessage = "Could not find postgresql JDBC driver - please ensure " + 
    79                         "postgresql-...jdbc4.jar is available on the classpath."; 
    80                 logger.error(errorMessage); 
    81                 throw new DiscoveryDBException(errorMessage); 
     78                System.out.println("Couldn't find the driver!"); 
     79                        System.out.println("Let's print a stack trace, and exit."); 
     80                         
     81                        //System.exit(1); 
     82                //String errorMessage = "Could not find postgresql JDBC driver - please ensure " + 
     83                        //"postgresql-...jdbc4.jar is available on the classpath."; 
     84                //logger.error(errorMessage); 
     85                //throw new DiscoveryDBException(errorMessage); 
    8286                }  
    8387             
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/SearchAgent.java

    r5488 r5559  
    537537 
    538538                // Construct the search clause for spatio temporal search, if necessary 
     539                String bbox = null; 
     540                String lstring = null; 
     541                String spatialPart = null; 
     542                 
     543                 
     544                 
    539545                if (isSpatialSearch()) { 
     546                         
    540547                        logger.info("Adding spatial data to query"); 
     548                         
    541549                        // set up the bounding box geometry for the search 
    542                         String bbox = "SetSRID('BOX3D(" + this.getLimitWest().floatValue() 
     550                        bbox = "SetSRID('BOX3D(" + this.getLimitWest().floatValue() 
    543551                                        + " " + this.getLimitSouth().floatValue() + ", " 
    544552                                        + this.getLimitEast().floatValue() + " " 
     
    546554 
    547555                        fromSqlCmd.append(", " + DBProperties.SPATIAL_DATA_TABLE); 
    548                         String spatialPart = DBProperties.SPATIAL_DATA_TABLE + ".geometry "; 
    549                         if (spatialOperator 
    550                                         .equals(DiscoveryServiceSkeleton.OVERLAPS_OPERATOR_TYPE)) { 
    551                                 spatialPart += "&& " + bbox + " "; 
    552                         } else if (spatialOperator 
    553                                         .equals(DiscoveryServiceSkeleton.WITHIN_OPERATOR_TYPE)) { 
     556                                                 
     557                        //is this a proximity near miss search? In which case we need to do some more stuff 
     558                        if ((this.getOrderByField() != null) && (this.getOrderByField().equals(DiscoveryServiceSkeleton.PROXIMITY_NEARMISS_ORDER))){ 
     559                                logger.info("Proximity near miss search specified!"); 
     560                                lstring = "SetSRID('LINESTRING (" + this.getLimitWest().floatValue() 
     561                                + " " + this.getLimitSouth().floatValue() + ", " 
     562                                + this.getLimitEast().floatValue() + " " 
     563                                + this.getLimitNorth().floatValue() + ")'::geometry, 4326)"; 
     564                                 
     565                                //deal with original AOI - but nothing within it this time 
     566                                spatialPart = "NOT " + DBProperties.SPATIAL_DATA_TABLE + ".geometry "; 
    554567                                spatialPart += "@ " + bbox + " "; 
    555                         } else if (spatialOperator.equals("doesNotOverlap")) { 
    556                                 spatialPart = "NOT " + spatialPart + "&& " + bbox + " "; 
    557                         } 
     568                                 
     569                                //formulate the expanded aoi 
     570                                spatialPart += "AND " + DBProperties.SPATIAL_DATA_TABLE + ".geometry @ ST_EXPAND(" + bbox 
     571                                + ",(ST_LENGTH2D(" + lstring + ")/100)*10)"; 
     572                                 
     573                                 
     574                        } else { 
     575                                logger.info("Standard search specified!"); 
     576                                //standard spatial query goes in here (original apart from bbox &fromsqlcmd) 
     577                                 
     578                                spatialPart = DBProperties.SPATIAL_DATA_TABLE + ".geometry "; 
     579                                if (spatialOperator.equals(DiscoveryServiceSkeleton.OVERLAPS_OPERATOR_TYPE)) { 
     580                                        spatialPart += "&& " + bbox + " "; 
     581                                } else if (spatialOperator 
     582                                                .equals(DiscoveryServiceSkeleton.WITHIN_OPERATOR_TYPE)) { 
     583                                        spatialPart += "@ " + bbox + " "; 
     584                                } else if (spatialOperator.equals("doesNotOverlap")) { 
     585                                        spatialPart = "NOT " + spatialPart + "&& " + bbox + " "; 
     586                                } 
     587                                 
     588                                 
     589                        } 
     590                         
    558591                        appendWhereClause(whereSqlCmd, spatialPart); 
    559592                        appendWhereClause(whereSqlCmd, DBProperties.SPATIAL_DATA_TABLE 
     
    561594                                        + DBProperties.SPATIAL_TEMPORAL_DATA_TABLE 
    562595                                        + ".spatial_data_id"); 
    563                 } 
    564  
    565                 //if (isTemporalSearch() || isOrderedByDate()) { 
    566                 if (isTemporalSearch()) { 
     596                         
     597                         
     598                } 
     599 
     600                if (isTemporalSearch() || isOrderedByDate()) { 
    567601                        logger.info("Adding temporal data to query"); 
    568602                        fromSqlCmd.append(", " + DBProperties.TEMPORAL_DATA_TABLE); 
     
    587621                // join this with the main 
    588622                // orig doc search query - NB, also need for date ordering 
    589                 //SJD 14/07/09: date ordering now done by colum in original_document table, so remove isOrderedByDate clause here...             
    590                 if (isTemporalSearch() || isSpatialSearch()) { 
     623                if (isTemporalSearch() || isSpatialSearch() || isOrderedByDate()) { 
    591624                        fromSqlCmd.append(", " + DBProperties.SPATIAL_TEMPORAL_DATA_TABLE); 
    592625                        whereSqlCmd.append(" AND " 
     
    607640                        logger.info("- adding specified order by parameter"); 
    608641                         
    609                         if (isOrderedByDate() || (this.getOrderByField().equals(DiscoveryServiceSkeleton.DATE_ORDER))) {                                 
    610                                 // ORDER BY DATE 
    611                                 logger.info("NB, refine ordering: order by 'start_time'"); 
    612                                 this.setOrderByField(DBProperties.START_TIME); 
     642                        if (isOrderedByDate() || (this.getOrderByField().equals(DiscoveryServiceSkeleton.DATE_ORDER_START))) {                           
     643                                // ORDER BY START DATE 
     644                                logger.info("NB, refine ordering: order by 'start_time' (NB, using updated non null ordering..."); 
     645                                //this.setOrderByField(DBProperties.START_TIME); 
     646                                this.setOrderByField(DBProperties.nonNull_ORDERBY_STATEMENT_tstamp(DBProperties.START_TIME));                            
     647                                 
     648                        } else if (isOrderedByDate() || (this.getOrderByField().equals(DiscoveryServiceSkeleton.DATE_ORDER_END)))  { 
     649                                // ORDER BY END DATE 
     650                                logger.info("NB, refine ordering: order by 'end_time' (NB, using updated non null ordering..."); 
     651                                //this.setOrderByField(DBProperties.START_TIME); 
     652                                this.setOrderByField(DBProperties.nonNull_ORDERBY_STATEMENT_tstamp(DBProperties.END_TIME));                              
    613653                                 
    614654                        } else if (this.getOrderByField().equals(DiscoveryServiceSkeleton.DATACENTRE_ORDER)) { 
     
    630670                                // ORDER BY DATASET RESULTSET POPULARITY 
    631671                                logger.info("NB, refine  ordering: order by 'resultset_count'"); 
    632                                 this.setOrderByField(DBProperties.DATASET_RESULTSET_POPULARITY); 
     672                                //this.setOrderByField(DBProperties.DATASET_RESULTSET_POPULARITY); 
     673                                this.setOrderByField(DBProperties.nonNull_ORDERBY_STATEMENT_int(DBProperties.DATASET_RESULTSET_POPULARITY)); 
    633674                         
    634675                        } else if (this.getOrderByField().equals(DiscoveryServiceSkeleton.DATASET_LINKED_POPULARITY)) { 
    635676                                // ORDER BY DATASET INCLUDED LINK POPULARITY 
    636677                                logger.info("NB, refine  ordering: order by 'access_count'"); 
    637                                 this.setOrderByField(DBProperties.DATASET_LINKED_POPULARITY); 
    638                          
     678                                //this.setOrderByField(DBProperties.DATASET_LINKED_POPULARITY); 
     679                                this.setOrderByField(DBProperties.nonNull_ORDERBY_STATEMENT_int(DBProperties.DATASET_LINKED_POPULARITY)); 
     680                                 
    639681                        } else if (this.getOrderByField().equals(DiscoveryServiceSkeleton.TEXT_RELEVANCE_ORDER)) { 
    640682                                // ORDER BY DATASET TEXT RELEVANCE 
     
    646688                                // ORDER BY PROXIMITY 
    647689                                 
    648                                 //TODO how do we link this with existing linking stuff... 
    649                                 //logger.info("NB, refine  ordering: order by 'datacentre_name'"); 
    650                                 //this.setOrderByField(DBProperties.DATASET_NAME); 
     690                                logger.info("NB, refine  ordering: order by 'proximity'"); 
     691                                if (bbox != null){ 
     692                                        String thisProximityOrderString = "ST_Distance(ST_Centroid(SPATIAL_DATA.geometry), ST_Centroid(" + bbox + "))"; 
     693                                        this.setOrderByField(thisProximityOrderString); 
     694                                } else { 
     695                                        logger.warn("Could not formulate geospatial ordering sql as bbx not formulated.  Therefore leave ordering as is."); 
     696                                } 
     697                                 
     698                        } else if (this.getOrderByField().equals(DiscoveryServiceSkeleton.PROXIMITY_NEARMISS_ORDER)) { 
     699                                // ORDER BY NEAR MISSPROXIMITY 
     700                                 
     701                                //TODO! Need to ingest test files for checking and incorporate updated sql here 
     702                                 
     703                                //logger.info("NB, refine  ordering: order by 'proximity near miss'"); 
     704                                if (bbox != null){ 
     705                                        String thisProximityOrderString = "ST_Distance(ST_Centroid(SPATIAL_DATA.geometry), ST_Centroid(" + bbox + "))"; 
     706                                        this.setOrderByField(thisProximityOrderString); 
     707                                } else { 
     708                                        logger.warn("Could not formulate geospatial ordering sql as bbx not formulated.  Therefore leave ordering as is."); 
     709                                } 
     710                                 
    651711                        } 
    652712                         
     
    756816                                + this.getOrderByField()); 
    757817                if (this.getOrderByField() != null 
    758                                 && this.getOrderByField().equals( 
    759                                                 DiscoveryServiceSkeleton.DATE_ORDER)) { 
     818                                &&  
     819                (this.getOrderByField().equals(DiscoveryServiceSkeleton.DATE_ORDER_START)) ||(this.getOrderByField().equals(DiscoveryServiceSkeleton.DATE_ORDER_END))) { 
    760820                        logger.info("- yes we are"); 
    761821                        return true; 
     
    801861                if (this.getLimitEast() != null && this.getLimitWest() != null 
    802862                                && this.getLimitNorth() != null && this.getLimitSouth() != null) { 
    803                          
    804                         //SJD map search display can be a bit dodgy - even if bbox not touched will still return 179.2 rather than 180 etc, so need to be 
    805                         // a bit more flexible here                      
    806                         if (this.getLimitEast().intValue() >= 179 
    807                                         && this.getLimitWest().intValue() <= -179 
    808                                         && this.getLimitNorth().intValue() >= 89 
    809                                         && this.getLimitSouth().intValue() <= -89) { 
    810                                 logger 
    811                                                 .info("Spatial data is equivalent to global search - will ignore in search"); 
     863                        if (this.getLimitEast().intValue() == 180 
     864                                        && this.getLimitWest().intValue() == -180 
     865                                        && this.getLimitNorth().intValue() == 90 
     866                                        && this.getLimitSouth().intValue() == -90) { 
     867                                logger.info("Spatial data is equivalent to global search - will ignore in search"); 
    812868                                return false; 
    813869                        } 
Note: See TracChangeset for help on using the changeset viewer.