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/master 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 {
