SearchImpl.java

Go to the documentation of this file.
00001 /*
00002  * SearchImpl.java
00003  *
00004  *  Copyright (C) 2003 Alain MENSEGUEN
00005  *  www.net2map.org
00006  *
00007  *  This program is free software; you can redistribute it and/or
00008  *  modify it under the terms of the GNU General Public License
00009  *  as published by the Free Software Foundation; either version 2
00010  *  of the License, or (at your option) any later version.
00011  *
00012  *  This program is distributed in the hope that it will be useful,
00013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *  GNU Lesser General Public License for more details.
00016  *
00017  *  You should have received a copy of the GNU General Public License
00018  *  along with this program; if not, write to the Free Software
00019  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00020  */
00021 package org.net2map.pov.server;
00022 
00023 import java.sql.*;
00024 import java.util.*;
00025 import java.rmi.*;
00026 import java.rmi.server.*;
00027 import java.util.LinkedList;
00028 
00032 public class SearchImpl extends UnicastRemoteObject implements org.net2map.pov.server.Search
00033 {
00041     //public SearchImpl( ParameterSet params, DatabaseConnection con, WordList stopwords, AffixList affixes ) throws RemoteException
00042     public SearchImpl( ParameterSet params, DatabaseConnection con ) throws RemoteException
00043     {
00044         pParameters = params;
00045         cConnection = con;
00046         //wStopwords = stopwords;
00047         //pAffixes = affixes;
00048         this.reset();
00049     }
00050     
00055     public ResultList getResults() throws RemoteException
00056     {
00057         return rResults;
00058     }
00059     
00064     /*public void setStopwords(WordList stopwords) throws RemoteException
00065     {
00066         wStopwords = stopwords;
00067     }*/
00068     
00073     /*public void setAffixes(AffixList affixes) throws RemoteException
00074     {
00075         pAffixes = affixes;
00076     }*/
00077     
00082     public long getTimeElapsed() throws RemoteException
00083     {
00084         return lTimeElapsed;
00085     }
00086     
00087     private ParameterSet pParameters;
00088     //private WordList wStopwords;
00089     //private AffixList pAffixes;
00090     private DatabaseConnection cConnection;
00091     //private WordList wWords;
00092     //private boolean bIsNormalized;
00093     private QueryList qQueries;
00094     //private WordList wNormalized;
00095     //private WordList wFinalwords;
00096     //private ResultList rResults;
00097     private ResultListImpl rResults;
00098     //private DimensionSubsetList pDimensions;
00099     private DimensionSubsetListImpl pDimensions;
00100     private long lTimeElapsed;
00101     
00107     public ResultList execute() throws RemoteException
00108     {
00109         Result result;
00110         Statement stid, sturl, stinfo;
00111         long urlid = 0, rating = 0;
00112         int i = 0;
00113         String squery = "";
00114         String sfield = "";
00115         java.util.Date dDate;
00116         System.out.println("SearchImpl.execute...");
00117 
00118         lTimeElapsed = System.currentTimeMillis();
00119         
00120         if ( qQueries.count() == 0 )
00121         {
00122             buildQueries();
00123         }
00124         
00125         try {
00128             stid = cConnection.execute( qQueries.getQuery( "query_url_id" ).toString() );
00129             
00130             if ( pParameters.DEBUG > 1 )
00131             {
00132                 System.out.println( "\nStep 3 : Building results list..." );
00133             }
00134             
00135             while ( stid.getResultSet().next() )
00136             {
00137                 if ( pParameters.DEBUG > 2 ) 
00138                 {
00139                     System.out.println( "\nBuilding result " + stid.getResultSet().getLong( 1 ) + "...");
00140                 }
00141                 
00142                 urlid = stid.getResultSet().getLong( 1 );
00143                 
00144                 result = new ResultImpl( urlid );
00145                 
00146                 //System.out.println( "pDimensions.count() = " + pDimensions.count() );
00147                 
00148                 /*System.out.println( "BIT = " + java.sql.Types.BIT );
00149                 System.out.println( "TINYINT = " + java.sql.Types.TINYINT );
00150                 System.out.println( "SMALLINT = " + java.sql.Types.SMALLINT );
00151                 System.out.println( "INTEGER = " + java.sql.Types.INTEGER );
00152                 System.out.println( "BIGINT = " + java.sql.Types.BIGINT );
00153                 System.out.println( "FLOAT = " + java.sql.Types.FLOAT );
00154                 System.out.println( "REAL = " + java.sql.Types.REAL );
00155                 System.out.println( "DOUBLE = " + java.sql.Types.DOUBLE );
00156                 System.out.println( "NUMERIC = " + java.sql.Types.NUMERIC );
00157                 System.out.println( "DECIMAL = " + java.sql.Types.DECIMAL );
00158                 System.out.println( "CHAR = " + java.sql.Types.CHAR );
00159                 System.out.println( "VARCHAR = " + java.sql.Types.VARCHAR );
00160                 System.out.println( "LONGVARCHAR = " + java.sql.Types.LONGVARCHAR );
00161                 System.out.println( "DATE = " + java.sql.Types.DATE );
00162                 System.out.println( "TIME = " + java.sql.Types.TIME );
00163                 System.out.println( "TIMESTAMP = " + java.sql.Types.TIMESTAMP );
00164                 System.out.println( "BINARY = " + java.sql.Types.BINARY );
00165                 System.out.println( "VARBINARY = " + java.sql.Types.VARBINARY );
00166                 System.out.println( "LONGVARBINARY = " + java.sql.Types.LONGVARBINARY );
00167                 System.out.println( "NULL = " + java.sql.Types.NULL );
00168                 System.out.println( "OTHER = " + java.sql.Types.OTHER );*/
00169                 
00170                 for ( i = 0; i < pDimensions.count(); i++ )
00171                 {
00172                     //System.out.println( "Dimension " + i + " : " + pDimensions.getSubset( i ).getOrderNb() + " : " + pDimensions.getSubset( i ).getSubsetQuery().toString() );
00173                     //System.out.println( "field name : " + stid.getResultSet().getMetaData().getColumnName( pDimensions.getSubset( i ).getOrderNb() + 1 ) );
00174                     //System.out.println( "type : " + stid.getResultSet().getMetaData().getColumnType( pDimensions.getSubset( i ).getOrderNb() + 1 ) );
00175                     switch ( stid.getResultSet().getMetaData().getColumnType( pDimensions.getSubset( i ).getOrderNb() + 1 ) )
00176                     {
00177                         case java.sql.Types.BIT:
00178                             break;
00179                         case java.sql.Types.TINYINT:
00180                             break;
00181                         case java.sql.Types.SMALLINT:
00182                             break;
00183                         case java.sql.Types.INTEGER:
00184                         case java.sql.Types.BIGINT:
00185                             result.getDimensionValues().add( String.valueOf( stid.getResultSet().getLong( pDimensions.getSubset( i ).getOrderNb() + 1 ) ) );
00186                             break;
00187                         case java.sql.Types.FLOAT:
00188                             break;
00189                         case java.sql.Types.REAL:
00190                             break;
00191                         case java.sql.Types.DOUBLE:
00192                             result.getDimensionValues().add( String.valueOf( stid.getResultSet().getDouble( pDimensions.getSubset( i ).getOrderNb() + 1 ) ) );
00193                             break;
00194                         case java.sql.Types.NUMERIC:
00195                             break;
00196                         case java.sql.Types.DECIMAL:
00197                             break;
00198                         case java.sql.Types.CHAR:
00199                             break;
00200                         case java.sql.Types.VARCHAR:
00201                             result.getDimensionValues().add( stid.getResultSet().getString( pDimensions.getSubset( i ).getOrderNb() + 1 ) );
00202                             break;
00203                         case java.sql.Types.LONGVARCHAR:
00204                             break;
00205                         case java.sql.Types.DATE:
00206                             break;
00207                         case java.sql.Types.TIME:
00208                             break;
00209                         case java.sql.Types.TIMESTAMP:
00210                             break;
00211                         case java.sql.Types.BINARY:
00212                             break;
00213                         case java.sql.Types.VARBINARY:
00214                             break;
00215                         case java.sql.Types.LONGVARBINARY:
00216                             break;
00217                         case java.sql.Types.NULL:
00218                             break;
00219                         case java.sql.Types.OTHER:
00220                             break;
00221                         default:
00222                             break;
00223                     }
00224                     
00225                     if ( pParameters.DEBUG > 2 )
00226                     {
00227                         System.out.println( "Adding dimension " + i + " : value : " + result.getDimensionValues().get( i ) );
00228                     }
00229                 }
00230                 
00233                 squery = pParameters.replace( qQueries.getQuery( "query_url" ).toString(),
00234                                               "%URL_IN%", 
00235                                               String.valueOf( urlid ) );
00236                 
00237                 if ( pParameters.DEBUG > 2 )
00238                 {
00239                     System.out.println( "Detailed url query " + urlid + " : " + squery );
00240                 }
00241                 
00242                 sturl = cConnection.execute( squery );
00243                 
00244                 while ( sturl.getResultSet().next() )
00245                 {
00247                     result.setDocSize( sturl.getResultSet().getLong( 1 ) );
00248                     dDate = new java.util.Date( sturl.getResultSet().getLong( 2 ) );
00249                     result.setLastModTime( dDate );
00250                     result.setPopRank( sturl.getResultSet().getDouble( 3 ) );
00251                     result.setURL( sturl.getResultSet().getString( 4 ) );
00252                     
00253                     if ( pParameters.DEBUG > 2 )
00254                     {
00255                         System.out.println( "recid = " + String.valueOf( result.getRecID() ) );
00256                         System.out.println( "docsize = " + String.valueOf( result.getDocSize() ) );
00257                         System.out.println( "lastmodtime = " + result.getLastModTime().toString() );
00258                         System.out.println( "poprank = " + String.valueOf( result.getPopRank() ) );
00259                         System.out.println( "url = " + result.getUrl() );
00260                     }
00261                     
00265                     squery = pParameters.replace( qQueries.getQuery( "query_url_info" ).toString(), 
00266                                               "%URL_IN%", 
00267                                               String.valueOf( urlid ) );
00268                     
00269                     if ( pParameters.DEBUG > 2 ) 
00270                     {
00271                         System.out.println( "Detailed urlinfo query " + urlid + " : " + squery );
00272                     }
00273                     
00274                     try 
00275                     {
00276                         stinfo = cConnection.execute( squery );
00277                     
00278                         while ( stinfo.getResultSet().next() )
00279                         {
00280                             sfield = stinfo.getResultSet().getString( 1 );
00281                         
00284                             if ( sfield.compareTo( "title" ) == 0 )
00285                             {
00286                                 result.setTitle( stinfo.getResultSet().getString( 2 ) );
00287                             }
00288                             else if ( sfield.compareTo( "Content-Type" ) == 0 )
00289                             {
00290                                 result.setConType( stinfo.getResultSet().getString( 2 ) );
00291                             }
00292                             else if ( sfield.compareTo( "Content-Language" ) == 0 )
00293                             {
00294                                 result.setConLanguage( stinfo.getResultSet().getString( 2 ) );
00295                             }
00296                             else if ( sfield.compareTo( "Charset" ) == 0 )
00297                             {
00298                                 result.setCharSet( stinfo.getResultSet().getString( 2 ) );
00299                             }
00300                             else if ( sfield.compareTo( "body" ) == 0 )
00301                             {
00302                                 result.setBody( stinfo.getResultSet().getString( 2 ) );
00303                             }
00304                         }
00305                         stinfo.close();
00306                     
00307                         if ( pParameters.DEBUG > 2 )
00308                         {
00309                             System.out.println( "title = " + result.getTitle() );
00310                             System.out.println( "contype = " + result.getConType() );
00311                             System.out.println( "conlanguage = " + result.getConLanguage() );
00312                             System.out.println( "charset = " + result.getCharSet() );
00313                             System.out.println( "body = " + result.getBody() );
00314                         }
00315                     
00317                         rResults.addResult( result );
00318                     }
00319                     catch (Exception theException)
00320                     {
00321                         System.out.println("EXCEPTION: " + theException);
00322                     }
00323                 }
00324                 sturl.getResultSet().close();
00325             }
00326             stid.close();
00327         }
00328         catch ( Exception e )
00329         {
00330             if ( pParameters.DEBUG > 0 ) 
00331             {
00332                 System.out.println( "Error raised executing search: " + e);
00333             }
00334             //throw e;
00335         }
00336         
00337         lTimeElapsed = System.currentTimeMillis() - lTimeElapsed;
00338         
00339         if ( pParameters.DEBUG > 0 ) 
00340         {
00341             System.out.println( "Results list built in " + ( (double)lTimeElapsed / 1000 ) + "s !" );//+ resid.getLong( 1 ) );
00342         }
00343 
00344         return rResults;
00345     }
00346     
00353     public void buildQueries() throws RemoteException
00354     {
00355         Query qUrlId = new Query( pParameters );
00356         Query qUrlInfo = new Query( pParameters );
00357         Query qUrl = new Query( pParameters );
00358         
00359         //DimensionSubsetList dimTmp = new DimensionSubsetList();
00360         int i, j;
00361         
00362         if ( pParameters.DEBUG > 1 )
00363         {
00364             System.out.println( "\nStep 1 : Parsing dimensions (" + pDimensions.count() + ")..." );
00365         }
00366         
00368         for ( i = 0; i < pDimensions.count(); i++ )
00369         {
00370             pDimensions.getSubset( i ).buildSubset();
00371             if ( qUrlId.isEmpty() )
00372             {
00373                 qUrlId = pDimensions.getSubset( i ).getSubsetQuery();
00374             }
00375             else
00376             {
00377                 qUrlId.joinTo( pDimensions.getSubset( i ).getSubsetQuery() );
00378             }
00379         }
00380         
00381         if ( pParameters.DEBUG > 0 )
00382         {
00383             System.out.println( "Dimensions parsed!" );
00384         }
00385         
00386         if ( pParameters.DEBUG > 1 )
00387         {
00388             System.out.println( "\nStep 2 : Building queries..." );
00389         }
00390         
00392         qUrlId.setName( "query_url_id" );
00393         
00394         if( pParameters.DEBUG > 2 )
00395         {
00396             System.out.println( "qUrlId = " + qUrlId.toString() );
00397         }
00398         
00399         qUrl.setName( "query_url" );
00400         qUrl.setSelect( "url.docsize, url.last_mod_time, url.pop_rank, url.url" + pParameters.getCatField() );
00401         qUrl.setFrom( "url" ); 
00402         qUrl.setWhere( "url.rec_id = %URL_IN%" );
00403         
00404         if( pParameters.DEBUG > 2 )
00405         {
00406             System.out.println( "qUrl = " + qUrl.toString() );
00407         }
00408         
00409         qUrlInfo.setName( "query_url_info" );
00410         qUrlInfo.setSelect( "urlinfo.sname, urlinfo.sval" );
00411         qUrlInfo.setFrom( "urlinfo" );
00412         qUrlInfo.setWhere( "urlinfo.url_id = %URL_IN%" );
00413         
00414         if( pParameters.DEBUG > 2 ) 
00415         {
00416             System.out.println( "qUrlInfo = " + qUrlInfo.toString() );
00417         }
00418         
00419         qQueries.addQuery( qUrlId );
00420         qQueries.addQuery( qUrl );
00421         qQueries.addQuery( qUrlInfo );
00422         
00423         if( pParameters.DEBUG > 0 ) 
00424         {
00425             System.out.println( "Queries built!" );
00426         }
00427     }
00428     
00433     public DimensionSubsetList getDimensions() throws RemoteException
00434     {
00435         return pDimensions;
00436     }
00437     
00442     public void setDimensions(DimensionSubsetListImpl dim) throws RemoteException
00443     {
00444         pDimensions = dim;
00445     }
00446     
00452     /*public void addDimensionDate(long from, long to) throws RemoteException
00453     {
00454         System.out.println("SearchImpl.addDimensionDate(from " + from + " to " + to + " )");
00455         DimensionSubsetDate dDimension2 = new DimensionSubsetDate( from, to, pParameters );
00456         pDimensions.addSubset( dDimension2 );
00457     }*/
00458     
00464     /*public void addDimensionRank(double from, double to) throws RemoteException
00465     {
00466         System.out.println("SearchImpl.addDimensionRank(from " + from + " to " + to + " )");        
00467         DimensionSubsetRank dDimension3 = new DimensionSubsetRank( from, to, pParameters );
00468         pDimensions.addSubset( dDimension3 );
00469     }*/
00470     
00475     /*public void addDimensionWord(String expression) throws RemoteException
00476     {
00477         System.out.println("SearchImpl.addDimensionWord(\"" + expression + "\"");        
00478         DimensionSubsetWord dDimension1 = new DimensionSubsetWord( expression,
00479                                                                    pParameters,
00480                                                                    cConnection,
00481                                                                    wStopwords,
00482                                                                    pAffixes );
00483         pDimensions.addSubset( dDimension1 );
00484     }*/
00485     
00489     public void reset() throws RemoteException
00490     {
00491         System.gc();
00492         qQueries = new QueryList();
00493         //wFinalwords = new WordList( pParameters );
00494         pDimensions = new DimensionSubsetListImpl( pParameters, cConnection );
00495         //bIsNormalized = false;
00496         rResults = new ResultListImpl( pParameters );
00497     }
00498     
00499     public DimensionSubsetList getDimensionSubsetList() throws RemoteException {
00500         return pDimensions;
00501     }
00502 }
Accueil | Téléchargement | Manuel | Doc. technique | Sources CVS | Faq | Nous contacter
©2003 - All Rights Reserved