WAVE-311 Refactors the Solr search related classes some more.

Project: http://git-wip-us.apache.org/repos/asf/incubator-wave/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-wave/commit/571c3066
Tree: http://git-wip-us.apache.org/repos/asf/incubator-wave/tree/571c3066
Diff: http://git-wip-us.apache.org/repos/asf/incubator-wave/diff/571c3066

Branch: refs/heads/fulltextsearch
Commit: 571c30663e802a9b34a66d79abdcb5724bdb19c3
Parents: 2c4a350
Author: Yuri Zelikov <[email protected]>
Authored: Sat Apr 26 00:30:32 2014 +0300
Committer: Yuri Zelikov <[email protected]>
Committed: Wed Aug 27 19:17:55 2014 +0300

----------------------------------------------------------------------
 .../waveserver/AbstractSearchProviderImpl.java  |   2 +-
 .../server/waveserver/AbstractWaveIndexer.java  |  43 -------
 .../server/waveserver/SolrWaveIndexerImpl.java  | 125 +++++++++----------
 .../box/server/waveserver/WaveMap.java          |   8 ++
 4 files changed, 71 insertions(+), 107 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/571c3066/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java 
b/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java
index 673a02e..48e89a2 100644
--- a/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java
+++ b/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java
@@ -113,8 +113,8 @@ public abstract class AbstractSearchProviderImpl implements 
SearchProvider {
       // look at the user's wave view and determine if the view matches the
       // query.
       try {
+        waveletContainer = waveMap.getWavelet(waveletname);
         if ((waveletContainer == null) || 
!waveletContainer.applyFunction(matchesFunction)) {
-          LOG.fine("----doesn't match: " + waveletContainer);
           continue;
         }
         if (view == null) {

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/571c3066/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java 
b/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java
index 18b88e1..13f1283 100644
--- a/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java
+++ b/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java
@@ -20,21 +20,9 @@
 package org.waveprotocol.box.server.waveserver;
 
 import org.waveprotocol.box.common.ExceptionalIterator;
-import org.waveprotocol.box.server.robots.util.ConversationUtil;
-import org.waveprotocol.wave.model.conversation.ObservableConversation;
-import org.waveprotocol.wave.model.conversation.ObservableConversationBlip;
-import org.waveprotocol.wave.model.conversation.ObservableConversationView;
-import org.waveprotocol.wave.model.conversation.TitleHelper;
-import org.waveprotocol.wave.model.conversation.WaveletBasedConversation;
-import org.waveprotocol.wave.model.document.Document;
 import org.waveprotocol.wave.model.id.WaveId;
 import org.waveprotocol.wave.model.id.WaveletId;
 import org.waveprotocol.wave.model.id.WaveletName;
-import org.waveprotocol.wave.model.wave.data.ObservableWaveletData;
-import org.waveprotocol.wave.model.wave.data.impl.WaveViewDataImpl;
-import org.waveprotocol.wave.model.wave.opbased.OpBasedWavelet;
-
-import javax.annotation.Nullable;
 
 /**
  * Base implementation of {@link WaveIndexer}.
@@ -51,37 +39,6 @@ public abstract class AbstractWaveIndexer implements 
WaveIndexer {
     this.waveMap = waveMap;
   }
 
-  /*
-   * TODO (Frank R.) move to TitleHelper. Currently, WaveletContainer is of
-   * default visibility, which prevents the re-factoring.
-   */
-  // TODO (yurize) : the method is not used, should we remove it?
-  @Nullable
-  static String constructTitle(WaveId waveId, WaveletId waveletId, WaveMap 
waveMap,
-      ConversationUtil conversationUtil) throws WaveletStateException {
-
-    String title = null;
-
-    WaveViewDataImpl wave = WaveViewDataImpl.create(waveId);
-
-    WaveletName waveletname = WaveletName.of(waveId, waveletId);
-    WaveletContainer waveletContainer = waveMap.getWavelet(waveletname);
-
-    wave.addWavelet(waveletContainer.copyWaveletData());
-    for (ObservableWaveletData waveletData : wave.getWavelets()) {
-      OpBasedWavelet wavelet = OpBasedWavelet.createReadOnly(waveletData);
-      if (WaveletBasedConversation.waveletHasConversation(wavelet)) {
-        ObservableConversationView conversations = 
conversationUtil.buildConversation(wavelet);
-        ObservableConversation root = conversations.getRoot();
-        ObservableConversationBlip firstBlip = 
root.getRootThread().getFirstBlip();
-        Document firstBlipContents = firstBlip.getContent();
-        title = TitleHelper.extractTitle(firstBlipContents).trim();
-        break;
-      }
-    }
-    return title;
-  }
-
   /**
    * Forces all waves to be loaded into memory and processes each wavelet.
    */

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/571c3066/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java 
b/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
index 3a7afa3..e9b6876 100644
--- a/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
+++ b/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
@@ -141,66 +141,17 @@ PerUserWaveViewBus.Listener {
   }
 
   private void updateIndex(ReadableWaveletData wavelet) throws IndexException {
-
     Preconditions.checkNotNull(wavelet);
     if (!IdUtil.isConversationalId(wavelet.getWaveletId())) {
-      return;
+      JsonArray docsJson = buildJsonDoc(wavelet);
+      postUpdateToSolr(wavelet, docsJson);
     }
+  }
 
+  private void postUpdateToSolr(ReadableWaveletData wavelet, JsonArray 
docsJson) {
     PostMethod postMethod =
         new PostMethod(SolrSearchProviderImpl.SOLR_BASE_URL + 
"/update/json?commit=true");
     try {
-      JsonArray docsJson = new JsonArray();
-
-      String waveId = wavelet.getWaveId().serialise();
-      String waveletId = wavelet.getWaveletId().serialise();
-      String modified = Long.toString(wavelet.getLastModifiedTime());
-      String creator = wavelet.getCreator().getAddress();
-
-      for (String docName : wavelet.getDocumentIds()) {
-        ReadableBlipData document = wavelet.getDocument(docName);
-
-        if (!IdUtil.isBlipId(docName)) {
-          continue;
-        }
-
-        Iterable<DocInitialization> ops = Lists.newArrayList(
-            document.getContent().asOperation());
-        String text = Snippets.collateTextForOps(ops, new 
Function<StringBuilder, Void>() {
-
-          @Override
-          public Void apply(StringBuilder resultBuilder) {
-            resultBuilder.append("\n");
-            return null;
-          }
-
-        });
-
-        JsonArray participantsJson = new JsonArray();
-        for (ParticipantId participant : wavelet.getParticipants()) {
-          String participantAddress = participant.toString();
-          participantsJson.add(new JsonPrimitive(participantAddress));
-        }
-
-        String id =
-            
JavaWaverefEncoder.encodeToUriPathSegment(WaveRef.of(wavelet.getWaveId(),
-                wavelet.getWaveletId(), docName));
-
-        JsonObject docJson = new JsonObject();
-        docJson.addProperty(SolrSearchProviderImpl.ID, id);
-        docJson.addProperty(SolrSearchProviderImpl.WAVE_ID, waveId);
-        docJson.addProperty(SolrSearchProviderImpl.WAVELET_ID, waveletId);
-        docJson.addProperty(SolrSearchProviderImpl.DOC_NAME, docName);
-        docJson.addProperty(SolrSearchProviderImpl.LMT, modified);
-        docJson.add(SolrSearchProviderImpl.WITH, participantsJson);
-        docJson.add(SolrSearchProviderImpl.WITH_FUZZY, participantsJson);
-        docJson.addProperty(SolrSearchProviderImpl.CREATOR, creator);
-        docJson.addProperty(SolrSearchProviderImpl.TEXT, text);
-        docJson.addProperty(SolrSearchProviderImpl.IN, "inbox");
-
-        docsJson.add(docJson);
-      }
-
       RequestEntity requestEntity =
           new StringRequestEntity(docsJson.toString(), "application/json", 
"UTF-8");
       postMethod.setRequestEntity(requestEntity);
@@ -208,16 +159,65 @@ PerUserWaveViewBus.Listener {
       HttpClient httpClient = new HttpClient();
       int statusCode = httpClient.executeMethod(postMethod);
       if (statusCode != HttpStatus.SC_OK) {
-        throw new IndexException(waveId);
+        throw new IndexException(wavelet.getWaveId().serialise());
       }
-
     } catch (IOException e) {
       throw new IndexException(String.valueOf(wavelet.getWaveletId()), e);
     } finally {
       postMethod.releaseConnection();
     }
+  }
 
-    return;
+  JsonArray buildJsonDoc(ReadableWaveletData wavelet) {
+    JsonArray docsJson = new JsonArray();
+
+    String waveletId = wavelet.getWaveletId().serialise();
+    String modified = Long.toString(wavelet.getLastModifiedTime());
+    String creator = wavelet.getCreator().getAddress();
+
+    for (String docName : wavelet.getDocumentIds()) {
+      ReadableBlipData document = wavelet.getDocument(docName);
+
+      if (!IdUtil.isBlipId(docName)) {
+        continue;
+      }
+
+      Iterable<DocInitialization> ops = 
Lists.newArrayList(document.getContent().asOperation());
+      String text = Snippets.collateTextForOps(ops, new 
Function<StringBuilder, Void>() {
+
+        @Override
+        public Void apply(StringBuilder resultBuilder) {
+          resultBuilder.append("\n");
+          return null;
+        }
+
+      });
+
+      JsonArray participantsJson = new JsonArray();
+      for (ParticipantId participant : wavelet.getParticipants()) {
+        String participantAddress = participant.toString();
+        participantsJson.add(new JsonPrimitive(participantAddress));
+      }
+
+      String id =
+          
JavaWaverefEncoder.encodeToUriPathSegment(WaveRef.of(wavelet.getWaveId(),
+              wavelet.getWaveletId(), docName));
+
+      JsonObject docJson = new JsonObject();
+      docJson.addProperty(SolrSearchProviderImpl.ID, id);
+      docJson.addProperty(SolrSearchProviderImpl.WAVE_ID, 
wavelet.getWaveId().serialise());
+      docJson.addProperty(SolrSearchProviderImpl.WAVELET_ID, waveletId);
+      docJson.addProperty(SolrSearchProviderImpl.DOC_NAME, docName);
+      docJson.addProperty(SolrSearchProviderImpl.LMT, modified);
+      docJson.add(SolrSearchProviderImpl.WITH, participantsJson);
+      docJson.add(SolrSearchProviderImpl.WITH_FUZZY, participantsJson);
+      docJson.addProperty(SolrSearchProviderImpl.CREATOR, creator);
+      docJson.addProperty(SolrSearchProviderImpl.TEXT, text);
+      docJson.addProperty(SolrSearchProviderImpl.IN, "inbox");
+
+      docsJson.add(docJson);
+    }
+    return docsJson;
   }
 
   @Override
@@ -252,15 +252,13 @@ PerUserWaveViewBus.Listener {
       }
     });
     executor.execute(task);
-
-    return;
   }
 
   @Override
   public synchronized void remakeIndex() throws WaveletStateException, 
WaveServerException {
 
     /*-
-     * to fully rebuild the index, need to delete everything first
+     * To fully rebuild the index, need to delete everything first
      * the <query> tag should contain the value of
      * org.waveprotocol.box.server.waveserver.SolrSearchProviderImpl.Q
      *
@@ -271,6 +269,11 @@ PerUserWaveViewBus.Listener {
      * 
http://wiki.apache.org/solr/FAQ#How_can_I_delete_all_documents_from_my_index.3F
      */
 
+    sendRequestToDeleteSolrIndex();
+    super.remakeIndex();
+  }
+
+  private void sendRequestToDeleteSolrIndex() {
     GetMethod getMethod = new GetMethod();
     try {
       getMethod
@@ -297,9 +300,5 @@ PerUserWaveViewBus.Listener {
     } finally {
       getMethod.releaseConnection();
     }
-
-    super.remakeIndex();
-
-    return;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/571c3066/src/org/waveprotocol/box/server/waveserver/WaveMap.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/box/server/waveserver/WaveMap.java 
b/src/org/waveprotocol/box/server/waveserver/WaveMap.java
index 68c1ed1..09ee788 100644
--- a/src/org/waveprotocol/box/server/waveserver/WaveMap.java
+++ b/src/org/waveprotocol/box/server/waveserver/WaveMap.java
@@ -145,6 +145,14 @@ public class WaveMap {
     }
   }
 
+  /**
+   * Tries to fetch the wavelet as remote, if not found - fetches as local
+   * wavelet.
+   *
+   * @param waveletName the wavelet name
+   * @return the local or remote wavelet.
+   * @throws WaveletStateException if something goes wrong
+   */
   public WaveletContainer getWavelet(WaveletName waveletName) throws 
WaveletStateException {
     WaveletContainer waveletContainer = null;
     try {

Reply via email to