Changeset 6767


Ignore:
Timestamp:
24/03/10 08:38:34 (9 years ago)
Author:
mnagni
Message:

Filling of the Spatial/Temporal? field in DocumentSummary/DocumentFull?.
Added new TicketId? tag in request/response messages
Removed the ResponseId? tag
Now the status return false ONLY in case of error
Small bug fixes
Artifact promoted to version 1.1.6

Location:
TI01-discovery-API/trunk/MEDINDiscoveryService
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery-API/trunk/MEDINDiscoveryService/pom.xml

    r6727 r6767  
    44        <groupId>ndg.services.discovery</groupId> 
    55        <artifactId>MedinDiscoveryService</artifactId> 
    6         <version>1.1.5</version> 
     6        <version>1.1.6</version> 
    77        <packaging>aar</packaging> 
    88 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/discovery/DiscoveryServiceMEDINSkeleton.java

    r6722 r6767  
    4444import ndg.services.discovery.medin.schema.SearchType; 
    4545import ndg.services.discovery.medin.schema.SimpleDocument1; 
     46import ndg.services.discovery.medin.schema.SpatialType; 
     47import ndg.services.discovery.medin.schema.TemporalType; 
    4648import ndg.services.discovery.medin.schema.TermSearchType; 
    4749import ndg.services.discovery.medin.schema.SearchType.SearchCriteria; 
     
    6264        private static String insLogSQL = "INSERT INTO discoverySearchLogging(search_term, date_of_search, scope, originator_IP, number_results_returned) values (?,?,?,?,?)"; 
    6365 
    64         private NdgLogger logHelper = DiscoveryBasic.getInstance().getNdgInstance(DiscoveryServiceMEDINSkeleton.class.getName()); 
     66        private NdgLogger logHelper = DiscoveryBasic.getInstance().getNdgInstance( 
     67                        DiscoveryServiceMEDINSkeleton.class.getName()); 
    6568 
    6669        /** 
     
    100103                DoSearchReturnDocument response = DoSearchReturnDocument.Factory.newInstance(); 
    101104                SearchReturnType responseContent = response.addNewDoSearchReturn(); 
    102  
    103                 SearchAgent agent = new SearchAgent(doSearch.getDoSearch()); 
     105                responseContent.setTicketId(doSearch.getDoSearch().getTicketId()); 
     106 
    104107                boolean status = false; 
    105                 String statusMessage = null; 
    106                 try { 
    107                         List<OriginalDocument> result = agent.doSearch(); 
    108                         SearchType st = doSearch.getDoSearch(); 
    109  
    110                         RetrieveCriteriaType rct = st.getRetrieveCriteria(); 
    111                         DiscoveryDictionary.RecordDetail type = DiscoveryDictionary.getRecordDetails(null); 
    112                         OrderByType[] orderBy = null; 
    113                         if (rct != null) { 
    114                                 type = DiscoveryDictionary.getRecordDetails(rct.getRecordDetail()); 
    115                                 orderBy = rct.getOrderByArray(); 
    116                         } 
    117  
    118                         processResult(result, responseContent.addNewDocuments(), type, orderBy); 
    119                         status = (result != null && result.size() > 0 ? true : false); 
    120                 } catch (NdgSQLException e) { 
    121                         logHelper.logMessage(e.getMessage(), Level.ERROR, e); 
    122                         statusMessage = e.getMessage(); 
    123                 } catch (ResourceNotAvailable e) { 
    124                         logHelper.logMessage(e.getMessage(), Level.ERROR, e); 
    125                         statusMessage = e.getMessage(); 
    126                 } finally { 
    127                         responseContent.setHits(agent.getHits()); 
    128                         if (statusMessage == null) { 
    129                                 NdgMessage msg = null; 
    130                                 if (responseContent.getHits() > 0) { 
    131                                         msg = new NdgMessage("search.successful", new Object[] {}); 
    132                                 } else { 
    133                                         msg = new NdgMessage("search.no.results", new Object[] {}); 
     108                String statusMsg = null; 
     109                SearchAgent agent = null; 
     110                NdgMessage msg = null; 
     111 
     112                SearchCriteria sc = doSearch.getDoSearch().getSearchCriteria(); 
     113                if (doSearch.getDoSearch().getSearchCriteria() == null 
     114                                || (sc.getSpatialSearch() == null && sc.getTemporalSearch() == null && (sc.getTermSearchArray() == null || sc 
     115                                                .getTermSearchArray().length == 0))) { 
     116                        msg = new NdgMessage("empty.searchcriteria", new Object[] {}); 
     117                        statusMsg = DiscoveryBasic.getInstance().getFormatter().getFormattedText(msg); 
     118                } else { 
     119                        try { 
     120                                agent = new SearchAgent(doSearch.getDoSearch()); 
     121                                List<OriginalDocument> result = agent.doSearch(); 
     122                                SearchType st = doSearch.getDoSearch(); 
     123 
     124                                RetrieveCriteriaType rct = st.getRetrieveCriteria(); 
     125                                DiscoveryDictionary.RecordDetail type = DiscoveryDictionary.getRecordDetails(null); 
     126                                OrderByType[] orderBy = null; 
     127                                if (rct != null) { 
     128                                        type = DiscoveryDictionary.getRecordDetails(rct.getRecordDetail()); 
     129                                        orderBy = rct.getOrderByArray(); 
    134130                                } 
    135                                 statusMessage = DiscoveryBasic.getInstance().getFormatter().getFormattedText(msg); 
    136                         } 
    137                         responseContent.setStatus(status); 
    138                         responseContent.setStatusMessage(statusMessage); 
    139                         responseContent.setResultId(0); // not used at the moment 
    140                 } 
     131 
     132                                processResult(result, responseContent.addNewDocuments(), type, orderBy); 
     133                                status = true; 
     134                        } catch (NdgSQLException e) { 
     135                                logHelper.logMessage(e.getMessage(), Level.ERROR, e); 
     136                                statusMsg = e.getMessage(); 
     137                        } catch (ResourceNotAvailable e) { 
     138                                logHelper.logMessage(e.getMessage(), Level.ERROR, e); 
     139                                statusMsg = e.getMessage(); 
     140                        } finally { 
     141                                responseContent.setHits(agent.getHits()); 
     142                                if (statusMsg == null) { 
     143                                        if (responseContent.getHits() > 0) { 
     144                                                msg = new NdgMessage("search.successful", new Object[] {}); 
     145                                        } else { 
     146                                                msg = new NdgMessage("search.no.results", new Object[] {}); 
     147                                        } 
     148                                        statusMsg = DiscoveryBasic.getInstance().getFormatter().getFormattedText(msg); 
     149                                } 
     150                        } 
     151                } 
     152                finalizeSearchReponse(status, statusMsg, responseContent, doSearch); 
     153                return response; 
     154        } 
     155 
     156        private void finalizeSearchReponse(boolean status, String statusMsg, SearchReturnType responseContent, 
     157                        DoSearchDocument doSearch) { 
     158                responseContent.setStatus(status); 
     159                responseContent.setStatusMessage(statusMsg); 
    141160                logClientIP(responseContent, doSearch); 
    142                 return response; 
    143161        } 
    144162 
     
    152170                DoPresentReturnDocument response = DoPresentReturnDocument.Factory.newInstance(); 
    153171                PresentReturnType responseContent = response.addNewDoPresentReturn(); 
     172                responseContent.setTicketId(doPresent.getDoPresent().getTicketId()); 
     173                 
    154174                boolean status = false; 
    155175                String statusMessage = null; 
     
    166186                        DiscoveryDictionary.RecordDetail detail = DiscoveryDictionary.getRecordDetails(recDetail); 
    167187                        processResult(result, responseContent.addNewDocuments(), detail, null); 
    168                         status = (result != null && result.size() > 0 ? true : false); 
     188                        status = true; 
    169189                } catch (NdgSQLException e) { 
    170190                        statusMessage = e.getMessage(); 
     
    432452                info.setResourceType(result.getResourceType() != null ? result.getResourceType() : ""); 
    433453                info.setTopicCategory(result.getTopicCategory() != null ? result.getTopicCategory() : ""); 
     454                info.setDatasetUpdateDate(result.getDatasetMetadataUpdateDate() != null ? result.getDatasetMetadataUpdateDate().toString() : ""); 
    434455        } 
    435456 
     
    437458                type.setDocumentId(result.getOriginalDocumentFilename()); 
    438459                type.setTitle(result.getDatasetName()); 
    439                 type.setDocument(result.getOriginalDocument()); 
    440460                type.setAbstract(result.getDatasetAbstract()); 
     461                type.setSpatialArray(result.getSpatialType().toArray(type.getSpatialArray())); 
     462                type.setTemporalArray(result.getTemporalType().toArray(type.getTemporalArray())); 
    441463                CustomInfo info = type.addNewAdditionalInformation(); 
    442464                fillCustomInfo(info, result); 
     465                type.setDocument(result.getOriginalDocument()); 
    443466        } 
    444467 
     
    447470                type.setTitle(result.getDatasetName()); 
    448471                type.setAbstract(result.getDatasetAbstract()); 
     472                type.setSpatialArray(result.getSpatialType().toArray(type.getSpatialArray())); 
     473                type.setTemporalArray(result.getTemporalType().toArray(type.getTemporalArray()));                
     474                CustomInfo info = type.addNewAdditionalInformation();            
     475                fillCustomInfo(info, result);            
    449476        } 
    450477 
     
    483510                Connection conn = DiscoveryBasic.getInstance().getLogConnection(); 
    484511                PreparedStatement stat = conn.prepareStatement(insLogSQL); 
    485                 String termSearch = doSearch.getDoSearch() != null  
    486                                 ? assembleTermSearch(doSearch.getDoSearch().getSearchCriteria())  
    487                                                 : null; 
     512                String termSearch = doSearch.getDoSearch() != null ? assembleTermSearch(doSearch.getDoSearch() 
     513                                .getSearchCriteria()) : null; 
    488514                stat.setString(1, termSearch); 
    489515                stat.setTimestamp(2, new Timestamp(Calendar.getInstance().getTimeInMillis())); 
    490                 String scope = doSearch.getDoSearch() != null  
    491                         ? getScope(doSearch.getDoSearch().getScopeArray())  
    492                                         : null; 
     516                String scope = doSearch.getDoSearch() != null ? getScope(doSearch.getDoSearch().getScopeArray()) : null; 
    493517                stat.setString(3, scope); 
    494518                stat.setString(4, clientIP); 
    495519                stat.setInt(5, responseContent.getHits()); 
    496520                stat.executeUpdate(); 
    497                 if (conn != null)  
     521                if (conn != null) 
    498522                        conn.close(); 
    499523        } 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/discovery/medin/DiscoveryDictionary.java

    r6659 r6767  
    7777                DataCenter("original_document.datacentre_name", "DataCenter", "datacentreName"), 
    7878                DatasetUpdate("original_document.update_date", "DatasetUpdateOrder", "updateDate"), 
    79                 DiscoveryIngestDate("original_document.create_date", "DiscoveryIngestDate", "createDate"); 
     79                DiscoveryIngestDate("original_document.create_date", "DiscoveryIngestDate", "createDate"), 
     80                DiscoveryTitle("original_document.dataset_name", "DiscoveryTitle", "datasetName"); 
    8081                 
    8182                private final String fieldName; 
     
    273274         
    274275        public static enum OriginalDocumentToTable { 
    275                 DocumentId("dataset_start_date_nom", "originalDocumentId"), 
     276                DocumentId("original_document_id", "originalDocumentId"), 
    276277                OriginalDocumentFilename("original_document_filename", "originalDocumentFilename"),      
    277278                DiscoveryId("discovery_id", "discoveryId"), 
     
    294295                Lineage("lineage", "lineage"), 
    295296                LimitationsPublicAccess("limitations_public_access", "limitationsPublicAccess"), 
    296                 DataOriginator("create_date", "dataOriginator"), 
     297                DataOriginator("data_originator", "dataOriginator"), 
    297298                CreateDate("create_date", "createDate"), 
    298299                UpdateDate("update_date", "updateDate"), 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/discovery/model/CommonMethods.java

    r6727 r6767  
    9999        } 
    100100         
    101         String assembleQuery(StringBuffer selectSQL, StringBuffer fromSQL, StringBuffer whereSQL) { 
     101        String assembleQuery(StringBuffer selectSQL, StringBuffer fromSQL, StringBuffer whereSQL, StringBuffer orderSQL) { 
    102102                /* -- Append the FROM clause to the SELECT command -- */ 
    103103                selectSQL.append(fromSQL); 
     
    108108                selectSQL.append(whereSQL); 
    109109 
     110                /* -- Append the ORDER BY clause to the WHERE command -- */ 
     111                if (orderSQL.length() > 0) { 
     112                        selectSQL.append(" ORDER BY "); 
     113                        selectSQL.append(orderSQL); 
     114                } 
     115                 
    110116                logHelper.logMessage("SQL query generated: " + selectSQL, Level.INFO); 
    111117                return selectSQL.toString(); 
     
    115121 
    116122                // NB, we use the postgres text search function to do term searches 
    117                 StringBuffer selectSQL = new StringBuffer("SELECT distinct original_document_filename "); 
     123                StringBuffer selectSQL = new StringBuffer("SELECT distinct original_document_filename, original_document_id "); 
    118124 
    119125                StringBuffer fromSQL = new StringBuffer(); 
    120126                StringBuffer whereSQL = new StringBuffer(); 
     127                StringBuffer orderSQL = new StringBuffer(); 
     128                 
    121129 
    122130                fromSQL.append(" FROM "); 
     
    126134                                 
    127135                /* -----ORDER BY----- */ 
    128                 StringBuffer orderSQL = getOrderBy(retrieveType, selectSQL); 
    129  
    130                 /* -- Append the ORDER BY clause to the WHERE command -- */ 
    131                 if (orderSQL.length() > 0) { 
    132                         whereSQL.append(" ORDER BY "); 
    133                         whereSQL.append(orderSQL); 
    134                 } 
     136                orderSQL = getOrderBy(retrieveType, selectSQL); 
    135137 
    136138                /* -- Finally assemble the query -- */ 
    137                 return assembleQuery(selectSQL, fromSQL, whereSQL); 
     139                return assembleQuery(selectSQL, fromSQL, whereSQL, orderSQL); 
    138140        } 
    139141 
     
    144146        void commitOrRollback(Connection conn, boolean commit) { 
    145147                try { 
    146                         if (conn != null) { 
     148                        if (!conn.isClosed() && conn != null) { 
    147149                                if (commit) { 
    148150                                        conn.commit(); 
     
    206208                        ret = loadResultSet(rs); 
    207209                } catch (SQLException e) { 
     210                        closeStatement(stat, rs); 
    208211                        NdgMessage msg = new NdgMessage("sql.resultset.parsing.error", new Object[] { sqlQuery }); 
    209212                        throw new NdgSQLException(msg, e); 
    210                 } finally { 
    211                         closeStatement(stat, rs); 
    212213                } 
    213214                return ret; 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/discovery/model/PresentAgent.java

    r6722 r6767  
    44import java.lang.reflect.InvocationTargetException; 
    55import java.sql.Connection; 
     6import java.sql.PreparedStatement; 
    67import java.sql.ResultSet; 
    78import java.sql.SQLException; 
     9import java.sql.Timestamp; 
    810import java.util.ArrayList; 
     11import java.util.Calendar; 
    912import java.util.Iterator; 
    1013import java.util.List; 
     
    1720import ndg.services.discovery.medin.DiscoveryDictionary; 
    1821import ndg.services.discovery.medin.DiscoveryDictionary.OriginalDocumentToTable; 
     22import ndg.services.discovery.medin.schema.BoundingBoxType; 
     23import ndg.services.discovery.medin.schema.DateRangeType; 
     24import ndg.services.discovery.medin.schema.DateValueType; 
    1925import ndg.services.discovery.medin.schema.RetrieveCriteriaType; 
     26import ndg.services.discovery.medin.schema.SpatialType; 
     27import ndg.services.discovery.medin.schema.TemporalType; 
    2028import ndg.services.discovery.medin.schema.SearchType.SearchCriteria; 
    2129import ndg.services.jpa.OriginalDocument; 
     
    3038public class PresentAgent extends CommonMethods<OriginalDocument> { 
    3139 
     40        private final static String spatialRangeSQL = "select st_xmin(geometry) as WEST, st_xmax(geometry) as EAST, st_ymin(geometry) as SOUTH, st_ymax(geometry) as NORTH from spatial_data WHERE original_document_id = ?"; 
     41        private final static String temporalRangeSQL = "SELECT start_time, end_time FROM temporal_data WHERE original_document_id = ?";  
     42         
    3243        private NdgLogger logHelper = DiscoveryBasic.getInstance().getNdgInstance(SearchAgent.class.getName()); 
    3344 
     
    6273                        SearchCriteria criteria, RetrieveCriteriaType retrieveType) { 
    6374 
    64                 String customInfo = "original_document.authors, original_document.parameters, original_document.resource_type, original_document.topic_category, original_document.lineage, original_document.limitations_public_access, original_document.data_originator, original_document.original_format_name"; 
     75                String customInfo = "dataset_metadata_update_date, original_document.authors, original_document.parameters, original_document.resource_type, original_document.topic_category, original_document.lineage, original_document.limitations_public_access, original_document.data_originator, original_document.original_format_name"; 
    6576 
    6677                String recDetail = retrieveType == null ? null : retrieveType.getRecordDetail(); 
     
    7283                if (detail.equals(DiscoveryDictionary.RecordDetail.DocumentBrief)) { 
    7384                        checkFROMComma(selectSQL, false); 
    74                         selectSQL.append(" dataset_name, dataset_metadata_update_date, " + customInfo); 
     85                        selectSQL.append(" dataset_name, " + customInfo); 
    7586                } 
    7687                if (detail.equals(DiscoveryDictionary.RecordDetail.DocumentSummary)) { 
    7788                        checkFROMComma(selectSQL, false); 
    78                         selectSQL.append(" dataset_name, dataset_abstract"); 
     89                        selectSQL.append(" dataset_name, dataset_abstract, " + customInfo); 
    7990                } 
    8091                if (detail.equals(DiscoveryDictionary.RecordDetail.DocumentFull)) { 
    8192                        checkFROMComma(selectSQL, false); 
    82                         selectSQL.append(" dataset_name, dataset_abstract, dataset_metadata_update_date, "      + customInfo); 
     93                        selectSQL.append(" dataset_name, dataset_abstract, "    + customInfo); 
    8394                } 
    8495 
     
    169180                                                                rs.getTimestamp((order.fieldName()))); 
    170181                                        } else if (Integer.class.isAssignableFrom(type)) { 
    171                                                 field.getWriteMethod().invoke(od, rs.getString(rs.getInt((order.fieldName())))); 
     182                                                field.getWriteMethod().invoke(od, rs.getInt((order.fieldName()))); 
    172183                                        } 
    173184                                } catch (IllegalArgumentException e) { 
     
    203214                } 
    204215                List<OriginalDocument> searchResult = executeSearch(conn, sqlQuery); 
     216                DiscoveryDictionary.RecordDetail detail = DiscoveryDictionary.getRecordDetails(type.getRecordDetail()); 
     217                if (detail.equals(DiscoveryDictionary.RecordDetail.DocumentFull) || detail.equals(DiscoveryDictionary.RecordDetail.DocumentSummary)) { 
     218                        fillSpatialTemporalData(conn, searchResult);                             
     219                } 
     220 
    205221                if (conn != null) { 
    206222                        try { 
     
    222238                return columnExist; 
    223239        } 
     240         
     241        private void fillSpatialTemporalData(Connection conn, List<OriginalDocument> searchResult){ 
     242                PreparedStatement ps = null; 
     243                ResultSet rs = null; 
     244                for (OriginalDocument doc : searchResult) { 
     245                        try { 
     246                                ps = conn.prepareStatement(temporalRangeSQL); 
     247                                ps.setInt(1, doc.getOriginalDocumentId());       
     248                                rs = ps.executeQuery(); 
     249                                fillTemporalData(doc, rs);       
     250                        } catch (SQLException e) { 
     251                                e.printStackTrace(); 
     252                        } 
     253                        try { 
     254                                ps = conn.prepareStatement(spatialRangeSQL); 
     255                                ps.setInt(1, doc.getOriginalDocumentId());       
     256                                rs = ps.executeQuery(); 
     257                                fillSpatialData(doc, rs);        
     258                        } catch (SQLException e) { 
     259                                e.printStackTrace(); 
     260                        } 
     261                } 
     262        } 
     263         
     264        private void fillTemporalData(OriginalDocument doc, ResultSet rs) throws SQLException { 
     265                TemporalType tt = null; 
     266                List<TemporalType> temporalTypes = new ArrayList<TemporalType>(); 
     267                List<DateValueType> valueTypes = new ArrayList<DateValueType>(); 
     268                Timestamp start = null; 
     269                Timestamp end = null; 
     270                DateValueType dt = null; 
     271                Calendar calendar = null; 
     272                while(rs.next()){ 
     273                        tt = TemporalType.Factory.newInstance(); 
     274                        tt.setDateRange(DateRangeType.Factory.newInstance()); 
     275                         
     276                        dt = DateValueType.Factory.newInstance(); 
     277                        start = rs.getTimestamp("start_time"); 
     278                        if (start != null) { 
     279                                calendar = calendar.getInstance(); 
     280                                calendar.setTimeInMillis(start.getTime()); 
     281                        } else { 
     282                                calendar = null; 
     283                        } 
     284                        dt.setDateValue1(calendar); 
     285                        valueTypes.add(dt); 
     286                         
     287                        dt = DateValueType.Factory.newInstance(); 
     288                        end = rs.getTimestamp("end_time"); 
     289                        if (end != null) { 
     290                                calendar = calendar.getInstance(); 
     291                                calendar.setTimeInMillis(end.getTime()); 
     292                        } else { 
     293                                calendar = null; 
     294                        } 
     295                        dt.setDateValue1(calendar); 
     296                        valueTypes.add(dt); 
     297                         
     298                        tt.getDateRange().setDateArray(valueTypes.toArray(new DateValueType[0])); 
     299                        temporalTypes.add(tt); 
     300                } 
     301                doc.setTemporalType(temporalTypes); 
     302        } 
     303         
     304        private void fillSpatialData(OriginalDocument doc, ResultSet rs) throws SQLException { 
     305                SpatialType st = null;           
     306                List<SpatialType> spatialTypes = new ArrayList<SpatialType>(); 
     307                while(rs.next()){ 
     308                        st = SpatialType.Factory.newInstance(); 
     309                        st.setBoundingBox(BoundingBoxType.Factory.newInstance()); 
     310                        st.getBoundingBox().setLimitWest(rs.getFloat("WEST")); 
     311                        st.getBoundingBox().setLimitEast(rs.getFloat("EAST")); 
     312                        st.getBoundingBox().setLimitSouth(rs.getFloat("SOUTH"));                         
     313                        st.getBoundingBox().setLimitNorth(rs.getFloat("NORTH")); 
     314                        spatialTypes.add(st); 
     315                } 
     316                doc.setSpatialType(spatialTypes); 
     317        } 
    224318} 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/discovery/model/SearchAgent.java

    r6725 r6767  
    4141 
    4242        private NdgLogger logHelper = DiscoveryBasic.getInstance().getNdgInstance(SearchAgent.class.getName()); 
    43          
     43 
    4444        private String updateCounterSQL = "UPDATE original_document SET resultset_count = ? WHERE original_document_filename = ?"; 
    4545        private String getValue = "SELECT resultset_count as counter from original_document"; 
    46          
    47         private enum OPERATOR {AND, OR, NOT, AND_NOT, OR_NOT}; 
     46 
     47        private enum OPERATOR { 
     48                AND, OR, NOT, AND_NOT, OR_NOT 
     49        }; 
    4850 
    4951        // how many results to display in result set 
     
    116118 
    117119                /* -- selects the interval of documents -- */ 
    118                 long start = (searchType.getStart() > 0 && searchType.getStart() < toFilter.size() + 1) ? searchType.getStart() : 1; 
     120                long start = (searchType.getStart() > 0 && searchType.getStart() < toFilter.size() + 1) ? searchType.getStart() 
     121                                : 1; 
    119122 
    120123                long howMany = searchType.getHowMany(); 
    121124                if (howMany > 0) { 
    122                         howMany = (toFilter.size() >= howMany + start - 1) ? howMany + start - 1: toFilter.size(); 
     125                        howMany = (toFilter.size() >= howMany + start - 1) ? howMany + start - 1 : toFilter.size(); 
    123126                } else { 
    124127                        howMany = toFilter.size(); 
     
    131134                return res; 
    132135        } 
    133          
    134         @Override        
     136 
     137        @Override 
    135138        List<String> loadResultSet(ResultSet rs) throws SQLException { 
    136139                List<String> ret = new ArrayList<String>(); 
     
    140143                return ret; 
    141144        } 
    142          
    143         protected String assembleSearch(SearchCriteria criteria) { 
    144  
    145                 // NB, we use the postgres text search function to do term searches 
    146                 StringBuffer sqlCmd = new StringBuffer("SELECT original_document_filename "); 
    147  
    148                 StringBuffer fromSQL = new StringBuffer(); 
    149                 StringBuffer whereSQL = new StringBuffer(); 
    150  
    151                 fromSQL.append(" FROM "); 
    152                 fromSQL.append(DiscoveryDictionary.ORIGINAL_DOCUMENT_TABLE); 
    153  
    154                 // NB, historically, limited wildcard searches were possible with 
    155                 // eXist 
    156                 // DB - so allow them here - although this will remove the 
    157                 // associated 
    158                 // benefits of text searching 
    159                 /* 
    160                  * if (isPOSIXWildcardSeach(term)) { term = convertWildcardTerm(term); 
    161                  * // since author + param data is stored as vectors, requires a // 
    162                  * slight fudge to convert to a searchable string if 
    163                  * (termColumn.equals(DBProperties.DOCUMENT_TS_VECTOR)) { 
    164                  * appendWhereClause(whereSqlCmd, DBProperties.ORIGINAL_DOCUMENT + 
    165                  * " ~ '" + term + "'"); } else { appendWhereClause(whereSqlCmd, 
    166                  * "strip(" + termColumn + ")::text ~ '" + term + "'"); } } else { 
    167                  */ 
    168  
    169                 assembleSearchQuery(sqlCmd, fromSQL, whereSQL,criteria, null); 
    170                                  
    171                 /* -----ORDER BY----- */ 
    172                 StringBuffer orderSQL = getOrderBy(searchType.getRetrieveCriteria(), sqlCmd); 
    173  
    174                 /* -- Append the ORDER BY clause to the WHERE command -- */ 
    175                 if (orderSQL.length() > 0) { 
    176                         whereSQL.append(" ORDER BY "); 
    177                         whereSQL.append(orderSQL); 
    178                 } 
    179  
    180                 /* -- Finally assemble the query -- */ 
    181                 return assembleQuery(sqlCmd, fromSQL, whereSQL); 
    182         } 
    183145 
    184146        @Override 
    185         void assembleSearchQuery(StringBuffer sqlCmd, StringBuffer fromSQL, StringBuffer whereSQL, 
    186                         SearchCriteria criteria, RetrieveCriteriaType retrieveType) { 
     147        void assembleSearchQuery(StringBuffer sqlCmd, StringBuffer fromSQL, StringBuffer whereSQL, SearchCriteria criteria, 
     148                        RetrieveCriteriaType retrieveType) { 
    187149                /* -- is a TermSearch? -- */ 
    188150                preapareTermSearch(fromSQL, whereSQL, criteria.getTermSearchArray()); 
     
    196158                /* -- has Scope request? -- */ 
    197159                preapareScopeSearch(fromSQL, whereSQL, searchType.getScopeArray()); 
    198                  
     160 
    199161                /* -- has an OriginalFormat request? -- */ 
    200162                preapareOriginalFormatSearch(fromSQL, whereSQL, searchType.getOriginalFormat()); 
     
    268230         */ 
    269231        private boolean isPOSIXWildcardSeach(String term) { 
    270                 //logger.info("Checking for wildcards in search term"); 
     232                // logger.info("Checking for wildcards in search term"); 
    271233                for (int i = 0, is = term.length(); i < is; i++) { 
    272234                        char c = term.charAt(i); 
     
    285247                                // case '|': 
    286248                        case '\\': 
    287                                 //logger.info("- found wildcards - treat as a regexp search"); 
     249                                // logger.info("- found wildcards - treat as a regexp search"); 
    288250                                return true; 
    289251                        default: 
     
    291253                        } 
    292254                } 
    293                 //logger.info("- no wildcards found - treat at text search"); 
     255                // logger.info("- no wildcards found - treat at text search"); 
    294256                return false; 
    295257        } 
     
    302264                Collections.sort(terms, new TermSearchTypeComparator()); 
    303265                boolean secondPass = false; 
    304                 int queryIndex = 0;  
     266                int queryIndex = 0; 
    305267                for (TermSearchType termType : terms) { 
    306268                        String term = termType.getTerm(); 
     
    329291 
    330292                        String operator = getOperator(termType.getOperator()); 
    331                          
    332                         if ((!secondPass && operator.equals(OPERATOR.NOT.name()))  
    333                                         || (secondPass && queryIndex < term.length())) { 
    334                                 whereSQL.append(" ");                            
     293 
     294                        if ((!secondPass && operator.equals(OPERATOR.NOT.name())) || (secondPass && queryIndex < term.length())) { 
     295                                whereSQL.append(" "); 
    335296                                whereSQL.append(operator); 
    336                                 whereSQL.append(" ");                            
    337                         }                        
    338                          
     297                                whereSQL.append(" "); 
     298                        } 
     299 
    339300                        whereSQL.append(" query" + Integer.toString(queryIndex) + " @@ ("); 
    340301                        whereSQL.append(termTarget.fieldName()); 
    341                         whereSQL.append(") ");           
    342                          
     302                        whereSQL.append(") "); 
     303 
    343304                        secondPass = true; 
    344305                        queryIndex++; 
     
    439400                whereSQL.append(".original_document_id "); 
    440401        } 
    441          
     402 
    442403        private void preapareScopeSearch(StringBuffer fromSQL, StringBuffer whereSQL, String[] scopes) { 
    443404                if (scopes == null || scopes.length == 0) 
     
    458419                } 
    459420 
    460                 if (safeBuffer.length() == 0)  
     421                if (safeBuffer.length() == 0) 
    461422                        return; 
    462                  
     423 
    463424                /* -- appends the terms (FROM part) -- */ 
    464425                checkFROMComma(fromSQL, false); 
    465426                fromSQL.append(" to_tsquery("); 
    466427                fromSQL.append(safeBuffer.toString()); 
    467                 fromSQL.append(") AS scopeQuery ");              
     428                fromSQL.append(") AS scopeQuery "); 
    468429                checkWHERE_AND(whereSQL, false); 
    469430                whereSQL.append(" scopeQuery @@ (scope_ts_vector) "); 
     
    472433 
    473434        void preapareOriginalFormatSearch(StringBuffer fromSQL, StringBuffer whereSQL, String originalFormat) { 
    474                 if (originalFormat == null)  
     435                if (originalFormat == null) 
    475436                        return; 
    476437                DiscoveryDictionary.OriginalFormat format = DiscoveryDictionary.getOriginalFormat(originalFormat); 
     
    481442                whereSQL.append("' "); 
    482443        } 
    483          
    484444 
    485445        /** 
    486          * Compares two {@link TermSearchType}s according to their {@link Term#getId()} 
     446         * Compares two {@link TermSearchType}s according to their 
     447         * {@link Term#getId()} 
    487448         **/ 
    488449        private class TermSearchTypeComparator implements Comparator<TermSearchType> { 
     
    495456                                return 0; 
    496457                        } 
    497                 }                
     458                } 
    498459        } 
    499460 
     
    501462                OPERATOR op = OPERATOR.AND; 
    502463                String ret = op.name(); 
    503  
     464                 
    504465                if (operator == null) 
    505                         return ret; 
     466                        return ret;              
     467                 
    506468                for (OPERATOR item : OPERATOR.values()) { 
    507469                        if (item.name().equals(operator)) { 
    508                                 op = item; 
     470                                ret = item.name(); 
     471                                if (item.equals(OPERATOR.AND_NOT))  
     472                                        ret = " AND NOT "; 
     473                                if (item.equals(OPERATOR.OR_NOT))  
     474                                        ret = " OR NOT ";                
    509475                                break; 
    510                         }                        
    511                 } 
    512                 ret = op.equals(OPERATOR.AND_NOT) ? " AND NOT " : op.name(); 
    513                 ret = op.equals(OPERATOR.OR_NOT) ? " OR NOT " : op.name(); 
     476                        } 
     477                } 
     478                 
    514479                return ret; 
    515480        } 
    516          
    517         private void updateCountVal(List<String> documentIDs) throws NdgSQLException, ResourceNotAvailable {             
     481 
     482        private void updateCountVal(List<String> documentIDs) throws NdgSQLException, ResourceNotAvailable { 
    518483                Connection conn = DiscoveryBasic.getInstance().getDiscoveryConnection(); 
    519484                boolean commit = false; 
     
    522487                        for (String docId : documentIDs) { 
    523488                                executeUpdateCountVal(conn, docId); 
    524                         }                        
     489                        } 
    525490                        commit = true; 
    526491                } catch (SQLException e) { 
     
    532497                } 
    533498        } 
    534          
     499 
    535500        private void executeUpdateCountVal(Connection conn, String docId) throws NdgSQLException { 
    536                 try {                    
     501                try { 
    537502                        Statement statement = conn.createStatement(); 
    538503                        ResultSet rs = statement.executeQuery(getValue); 
    539                         if(!rs.next()) 
     504                        if (!rs.next()) 
    540505                                return; 
    541506                        Integer counter = rs.getInt("counter"); 
    542                          
     507 
    543508                        PreparedStatement updateCounter = conn.prepareStatement(updateCounterSQL); 
    544                         updateCounter.setInt(1, counter+1); 
     509                        updateCounter.setInt(1, counter + 1); 
    545510                        updateCounter.setString(2, docId); 
    546511                        updateCounter.execute(); 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/jpa/OriginalDocument.java

    r6659 r6767  
    22 
    33import java.sql.Timestamp; 
     4import java.util.ArrayList; 
     5import java.util.List; 
     6 
     7import ndg.services.discovery.medin.schema.SpatialType; 
     8import ndg.services.discovery.medin.schema.TemporalType; 
    49 
    510 
     
    7984 
    8085        private Integer scn; 
     86         
     87        private List<TemporalType> temporalType = new ArrayList<TemporalType>(); 
     88         
     89        private List<SpatialType> spatialType = new ArrayList<SpatialType>(); 
    8190 
    8291        public OriginalDocument() { 
     
    379388                this.scn = scn; 
    380389        } 
     390 
     391        public final List<TemporalType> getTemporalType() { 
     392                return temporalType; 
     393        } 
     394 
     395        public final void setTemporalType(List<TemporalType> temporalType) { 
     396                this.temporalType = temporalType; 
     397        } 
     398 
     399        public final List<SpatialType> getSpatialType() { 
     400                return spatialType; 
     401        } 
     402 
     403        public final void setSpatialType(List<SpatialType> spatialType) { 
     404                this.spatialType = spatialType; 
     405        }        
    381406} 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/resources/META-INF/DiscoverySchema.xsd

    r6668 r6767  
    55                (NERC Earth Observation Data Centre) 
    66        --> 
    7 <xs:schema targetNamespace="http://medin.discovery.services.ndg/schema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://medin.discovery.services.ndg/schema"> 
     7<xs:schema targetNamespace="http://medin.discovery.services.ndg/schema" 
     8        elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0" 
     9        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     10        xmlns:tns="http://medin.discovery.services.ndg/schema"> 
    811        <!-- Request elements --> 
    912        <xs:element name="DoSearch" type="tns:SearchType"/> 
     
    3134                                </xs:annotation> 
    3235                        </xs:element> 
     36                        <xs:element name="TicketId" type="xs:string" minOccurs="0"> 
     37                                <xs:annotation> 
     38                                        <xs:documentation>Optional term that allow the client to track the request/response messages</xs:documentation> 
     39                                </xs:annotation> 
     40                        </xs:element> 
    3341                </xs:sequence> 
    3442        </xs:complexType> 
     
    5664                                <xs:complexType> 
    5765                                        <xs:sequence> 
    58                                                 <xs:element name="TermSearch" type="tns:TermSearchType" minOccurs="0" maxOccurs="unbounded"> 
     66                                                <xs:element name="TermSearch" type="tns:TermSearchType" minOccurs="0" 
     67                                                        maxOccurs="unbounded"> 
    5968                                                        <xs:annotation> 
    6069                                                                <xs:documentation>For multiple TermSearch elements with different TermTargets use the "operator" attribute to define the relationship between successive TermTargets with the "id" attribute providing the ordering information</xs:documentation> 
     
    99108                                </xs:annotation> 
    100109                        </xs:element> 
     110                        <xs:element name="TicketId" type="xs:string" minOccurs="1"> 
     111                                <xs:annotation> 
     112                                        <xs:documentation>Optional term that allow the client to track the request/response messages</xs:documentation> 
     113                                </xs:annotation> 
     114                        </xs:element> 
    101115                </xs:sequence> 
    102116        </xs:complexType> 
     
    111125                        <xs:element name="Status" type="xs:boolean"/> 
    112126                        <xs:element name="StatusMessage" type="xs:string"/> 
     127                        <xs:element name="TicketId" type="xs:string" minOccurs="0"> 
     128                                <xs:annotation> 
     129                                        <xs:documentation>Optional term that allow the client to track the request/response messages</xs:documentation> 
     130                                </xs:annotation> 
     131                        </xs:element> 
    113132                        <xs:element name="Documents" type="tns:Documents" minOccurs="0"/> 
    114133                </xs:sequence> 
     
    118137                        <xs:element name="Status" type="xs:boolean"/> 
    119138                        <xs:element name="StatusMessage" type="xs:string"/> 
    120                         <xs:element name="ResultId" type="xs:int" minOccurs="0"/> 
     139                        <xs:element name="TicketId" type="xs:string" minOccurs="0"> 
     140                                <xs:annotation> 
     141                                        <xs:documentation>Optional term that allow the client to track the request/response messages</xs:documentation> 
     142                                </xs:annotation> 
     143                        </xs:element> 
    121144                        <xs:element name="Hits" type="xs:int" minOccurs="0"/> 
    122145                        <xs:element name="Documents" type="tns:Documents" minOccurs="0"/> 
     
    273296                        <xs:extension base="tns:ReturnSimpleType"> 
    274297                                <xs:sequence> 
    275                                         <xs:element name="AdditionalInformation" type="tns:CustomInfo"/> 
     298                                        <xs:element name="AdditionalInformation" type="tns:CustomInfo"/>                                         
    276299                                        <xs:element name="Title" type="xs:string" minOccurs="0"/> 
    277                                         <xs:element name="OrderedField" type="tns:OrderingMetricType" minOccurs="0" maxOccurs="unbounded"> 
     300                                        <xs:element name="OrderedField" type="tns:OrderingMetricType" minOccurs="0" 
     301                                                maxOccurs="unbounded"> 
    278302                                                <xs:annotation> 
    279303                                                        <xs:documentation>Name value pair(s) representing field(s) corresoponding to orderBy fields in search request. </xs:documentation> 
     
    288312                        <xs:extension base="tns:ReturnSimpleType"> 
    289313                                <xs:sequence> 
     314                                        <xs:element name="AdditionalInformation" type="tns:CustomInfo"/>                                         
    290315                                        <xs:element name="Title" type="xs:string" minOccurs="0"/> 
    291                                         <xs:element name="OrderedField" type="tns:OrderingMetricType" minOccurs="0" maxOccurs="unbounded"> 
     316                                        <xs:element name="OrderedField" type="tns:OrderingMetricType" minOccurs="0" 
     317                                                maxOccurs="unbounded"> 
    292318                                                <xs:annotation> 
    293319                                                        <xs:documentation>Name value pair(s) representing field(s) corresoponding to orderBy fields in search request. </xs:documentation> 
     
    295321                                        </xs:element> 
    296322                                        <xs:element name="Abstract" type="xs:string" minOccurs="0"/> 
    297                                         <xs:element name="Temporal" type="tns:TemporalType" minOccurs="0" maxOccurs="unbounded"/> 
    298                                         <xs:element name="Spatial" type="tns:SpatialType" minOccurs="0" maxOccurs="unbounded"/> 
     323                                        <xs:element name="Temporal" type="tns:TemporalType" minOccurs="0" 
     324                                                maxOccurs="unbounded"/> 
     325                                        <xs:element name="Spatial" type="tns:SpatialType" minOccurs="0" 
     326                                                maxOccurs="unbounded"/> 
    299327                                </xs:sequence> 
    300328                        </xs:extension> 
     
    307335                                        <xs:element name="AdditionalInformation" type="tns:CustomInfo"/> 
    308336                                        <xs:element name="Title" type="xs:string" minOccurs="0"/> 
    309                                         <xs:element name="OrderedField" type="tns:OrderingMetricType" minOccurs="0" maxOccurs="unbounded"> 
     337                                        <xs:element name="OrderedField" type="tns:OrderingMetricType" minOccurs="0" 
     338                                                maxOccurs="unbounded"> 
    310339                                                <xs:annotation> 
    311340                                                        <xs:documentation>Name value pair(s) representing field(s) corresoponding to orderBy fields in search request. </xs:documentation> 
     
    313342                                        </xs:element> 
    314343                                        <xs:element name="Abstract" type="xs:string" minOccurs="0"/> 
    315                                         <xs:element name="Temporal" type="tns:TemporalType" minOccurs="0" maxOccurs="unbounded"/> 
    316                                         <xs:element name="Spatial" type="tns:SpatialType" minOccurs="0" maxOccurs="unbounded"/> 
     344                                        <xs:element name="Temporal" type="tns:TemporalType" minOccurs="0" 
     345                                                maxOccurs="unbounded"/> 
     346                                        <xs:element name="Spatial" type="tns:SpatialType" minOccurs="0" 
     347                                                maxOccurs="unbounded"/> 
    317348                                        <xs:element name="Document" type="xs:string"> 
    318349                                                <xs:annotation> 
     
    335366                                <xs:choice> 
    336367                                        <xs:sequence> 
    337                                                 <xs:element name="DocumentSimple" type="tns:ReturnSimpleType" maxOccurs="unbounded"/> 
    338                                         </xs:sequence> 
    339                                         <xs:sequence> 
    340                                                 <xs:element name="DocumentFull" type="tns:ReturnFullType" maxOccurs="unbounded"/> 
    341                                         </xs:sequence> 
    342                                         <xs:sequence> 
    343                                                 <xs:element name="DocumentBrief" type="tns:ReturnBriefType" maxOccurs="unbounded"/> 
    344                                         </xs:sequence> 
    345                                         <xs:sequence> 
    346                                                 <xs:element name="DocumentSummary" type="tns:ReturnSummaryType" maxOccurs="unbounded"/> 
     368                                                <xs:element name="DocumentSimple" type="tns:ReturnSimpleType" 
     369                                                        maxOccurs="unbounded"/> 
     370                                        </xs:sequence> 
     371                                        <xs:sequence> 
     372                                                <xs:element name="DocumentFull" type="tns:ReturnFullType" 
     373                                                        maxOccurs="unbounded"/> 
     374                                        </xs:sequence> 
     375                                        <xs:sequence> 
     376                                                <xs:element name="DocumentBrief" type="tns:ReturnBriefType" 
     377                                                        maxOccurs="unbounded"/> 
     378                                        </xs:sequence> 
     379                                        <xs:sequence> 
     380                                                <xs:element name="DocumentSummary" type="tns:ReturnSummaryType" 
     381                                                        maxOccurs="unbounded"/> 
    347382                                        </xs:sequence> 
    348383                                </xs:choice> 
     
    363398                        <xs:element name="DataOriginator" type="xs:string"/> 
    364399                        <xs:element name="OriginalFormatName" type="xs:string"/> 
     400                        <xs:element name="DatasetUpdateDate" type="xs:string"/>                  
    365401                </xs:sequence> 
    366402        </xs:complexType> 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/resources/ndg/common/messages.properties

    r6678 r6767  
    1212client.ip = The client ip is {0} 
    1313invalid.list.name = "Invalid list name: please use getListNames to get the valid list names"; 
     14empty.searchcriteria = "SearchCriteria cannot be empty"; 
Note: See TracChangeset for help on using the changeset viewer.