diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/ResizeableArrayList.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/ResizeableArrayList.java deleted file mode 100644 index f28ce84ce..000000000 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/ResizeableArrayList.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2005-2013 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.solr; - -import java.io.Serializable; -import java.util.AbstractList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.RandomAccess; - -/** - * A {@link List} implementation, backed by an array, taht supports resizing. - * - * This class supports the reuse of arrays across cache instances, reducing the number of - * temporary objects created by the Alfresco Solr indexing service. - * - * @author Alex Miller - */ -public class ResizeableArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable -{ - private static final long serialVersionUID = 1L; - - private Object[] values; - private int size; - boolean active = false; - - public ResizeableArrayList() - { - this(10); - } - - public ResizeableArrayList(int initialSize) - { - values = new Object[initialSize]; - size = initialSize; - } - - @SuppressWarnings("unchecked") - @Override - public E get(int index) - { - checkSize(index); - return (E)values[index]; - } - - private void checkSize(int index) - { - if (index >= size) - { - throw new ArrayIndexOutOfBoundsException("Index: " + index + ", Size: " + values.length); - } - } - - /** - * Resize the underlying to at least minSize. - * - * @param minSize - * @throws IllegalStateException if the instance is not active. - */ - public void resize(int minSize) - { - isActive(); - int oldSize = values.length; - if (minSize > oldSize) - { - int newSize = (oldSize * 3)/2 + 1; - if (newSize < minSize) - { - newSize = minSize; - } - // minCapacity is usually close to size, so this is a win: - values = Arrays.copyOf(values, newSize); - } - size = minSize; - } - - @Override - public int size() - { - return size; - } - - /** - * Copy elements from from into this instance - */ - public void copyFrom(ResizeableArrayList from) - { - isActive(); - values = Arrays.copyOf(from.values, from.values.length); - size = from.size; - } - - @SuppressWarnings("unchecked") - @Override - public E set(int index, E value) - { - checkSize(index); - isActive(); - - E oldValue = (E)values[index]; - values[index] = value; - return oldValue; - } - - @SuppressWarnings("unchecked") - @Override - protected Object clone() throws CloneNotSupportedException - { - try { - ResizeableArrayList v = (ResizeableArrayList) super.clone(); - v.values = Arrays.copyOf(values, values.length); - v.size = size; - return v; - } catch (CloneNotSupportedException e) { - throw new InternalError(); - } - } - - private void isActive() - { - if (!active) - { - throw new IllegalStateException("Not active"); - } - } - - void activate() - { - active = true; - } - - void deactivate() - { - active = false; - for (int i = 0 ; i < size ; i++) - { - values[i] = null; - } - } - - /** - * Sort the elements, in-place, contained in this list using {@link Comparator#} - * - * @param comparator The {@link Comparator} to sort with - */ - @SuppressWarnings("unchecked") - public void sort(Comparator comparator) - { - DualPivotQuickSort.sort((E[])values, 0, size -1 , comparator); - } -} diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java index f8f617118..ba05c9e41 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java @@ -69,6 +69,9 @@ import static org.alfresco.repo.search.adaptor.lucene.QueryConstants.FIELD_TXCOM import static org.alfresco.repo.search.adaptor.lucene.QueryConstants.FIELD_TXID; import static org.alfresco.repo.search.adaptor.lucene.QueryConstants.FIELD_TYPE; import static org.alfresco.repo.search.adaptor.lucene.QueryConstants.FIELD_VERSION; +import static org.alfresco.service.cmr.security.AuthorityType.EVERYONE; +import static org.alfresco.service.cmr.security.AuthorityType.GROUP; +import static org.alfresco.service.cmr.security.AuthorityType.GUEST; import static org.alfresco.solr.utils.Utils.notNullOrEmpty; import java.io.File; @@ -3216,17 +3219,10 @@ public class SolrInformationServer implements InformationServer */ private String addTenantToAuthority(String authority, String tenant) { - switch (AuthorityType.getAuthorityType(authority)) + AuthorityType authorityType = AuthorityType.getAuthorityType(authority); + if ((authorityType == GROUP || authorityType == EVERYONE || authorityType == GUEST) && !tenant.isEmpty()) { - case GROUP: - case EVERYONE: - case GUEST: - if (tenant.length() != 0) - { - return authority + "@" + tenant; - } - default: - break; + return authority + "@" + tenant; } return authority; } diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java index b27ec4299..14587cf1f 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java @@ -5496,8 +5496,6 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants throw new RuntimeException("Error analyzing multiTerm term: " + part, e); } } - - private boolean analyzeRangeTerms = true; protected Query newRangeQuery(String field, String part1, String part2, boolean startInclusive, boolean endInclusive) { final BytesRef start; @@ -5506,13 +5504,13 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants if (part1 == null) { start = null; } else { - start = analyzeRangeTerms ? analyzeMultitermTerm(field, part1) : new BytesRef(part1); + start = getAnalyzeRangeTerms() ? analyzeMultitermTerm(field, part1) : new BytesRef(part1); } if (part2 == null) { end = null; } else { - end = analyzeRangeTerms ? analyzeMultitermTerm(field, part2) : new BytesRef(part2); + end = getAnalyzeRangeTerms() ? analyzeMultitermTerm(field, part2) : new BytesRef(part2); } final TermRangeQuery query = new TermRangeQuery(field, start, end, startInclusive, endInclusive); diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/SolrContainerScorer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/SolrContainerScorer.java index 18affeca5..d59ff05bd 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/SolrContainerScorer.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/SolrContainerScorer.java @@ -37,10 +37,6 @@ import org.apache.lucene.search.Weight; */ public class SolrContainerScorer extends Scorer { - // Unused - Weight weight; - - SolrContainerScorerDocIdSetIterator iterator; diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformer.java index 5d6e230b6..c46b93314 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformer.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformer.java @@ -47,8 +47,6 @@ public class CachedDocTransformer extends DocTransformer { protected final static Logger log = LoggerFactory.getLogger(CachedDocTransformer.class); - private ResultContext context; - /* (non-Javadoc) * @see org.apache.solr.response.transform.DocTransformer#getName() */ diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/DocValueDocTransformer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/DocValueDocTransformer.java index 0b3799a32..40586674f 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/DocValueDocTransformer.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/DocValueDocTransformer.java @@ -42,11 +42,7 @@ import org.slf4j.LoggerFactory; public class DocValueDocTransformer extends DocTransformer { protected final static Logger log = LoggerFactory.getLogger(DocValueDocTransformer.class); - - ResultContext context; - - /* (non-Javadoc) * @see org.apache.solr.response.transform.DocTransformer#getName() */ diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/AdminHandlerIT.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/AdminHandlerIT.java index 140b6b1db..429ad4b01 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/AdminHandlerIT.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/AdminHandlerIT.java @@ -1,8 +1,10 @@ package org.alfresco.solr; +import static org.junit.Assert.fail; + import org.apache.lucene.util.LuceneTestCase; -import org.apache.solr.common.SolrException; import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CoreAdminParams; import org.apache.solr.handler.admin.CoreAdminHandler; import org.apache.solr.response.SolrQueryResponse; @@ -32,19 +34,33 @@ public class AdminHandlerIT extends AbstractAlfrescoSolrIT } @Test - public void testhandledCores() throws Exception + public void testHandledCores() { - requestAction("newCore"); - requestAction("updateCore"); - requestAction("removeCore"); + try + { + requestAction("newCore"); + requestAction("updateCore"); + requestAction("removeCore"); + } + catch (Exception e) + { + fail("Expected to receive no exception, but got " + e); + } } @Test - public void testhandledReports() throws Exception + public void testHandledReports() { - requestAction("CHECK"); - requestAction("REPORT"); - requestAction("SUMMARY"); + try + { + requestAction("CHECK"); + requestAction("REPORT"); + requestAction("SUMMARY"); + } + catch (Exception e) + { + fail("Expected to receive no exception, but got " + e); + } } private void requestAction(String actionName) throws Exception { diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/CloudTest.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/CloudTest.java deleted file mode 100644 index ab1e2bdf7..000000000 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/CloudTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.solr; - -public class CloudTest -{ - /* - public final static String QUERY = "a query"; - private Cloud cloud = new Cloud(); - @Mock SolrQueryRequest request; - - @SuppressWarnings({ "rawtypes" }) - @Test - public void testGetQueryWithZeroValues() - { - String fieldName = FIELD_DBID; - String operator = SolrInformationServer.AND; - Collection[] valueLists = new Collection[1]; - valueLists[0] = new ArrayList(); - String query = cloud.getQuery(fieldName, operator, valueLists); - assertEquals("", query); - - valueLists = new Collection[0]; - query = cloud.getQuery(fieldName, operator, valueLists); - assertEquals("", query); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Test - public void testGetQueryWithOneValue() - { - String fieldName = FIELD_DBID; - String operator = SolrInformationServer.AND; - Collection[] valueLists = new Collection[1]; - valueLists[0] = new ArrayList(); - Object value = "value"; - valueLists[0].add(value); - String query = cloud.getQuery(fieldName, operator, valueLists); - assertEquals(FIELD_DBID + ":" + value, query); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Test - public void testGetQueryWithManyValues() - { - String fieldName = FIELD_DBID; - String operator = SolrInformationServer.AND; - Collection[] valueLists = new Collection[2]; - valueLists[0] = new ArrayList(); - Object value1 = "value1"; - valueLists[0].add(value1); - Object value2 = "value2"; - valueLists[0].add(value2); - Object value3 = "value3"; - valueLists[0].add(value3); - valueLists[1] = new ArrayList(); - Object value4 = "value4"; - valueLists[1].add(value4); - String query = cloud.getQuery(fieldName, operator, valueLists); - assertEquals(FIELD_DBID + ":" + value1 + operator + FIELD_DBID + ":" + value2 + operator - + FIELD_DBID + ":" + value3 + operator + FIELD_DBID + ":" + value4, query); - } - - @Test - public void testExists() - { - boolean exists = cloud.exists(super.selectRequestHandler, request, QUERY); - assertFalse(exists); - } - - @Test - public void testGetDocList() - { - // The response is created in the getDocList method, and the aftsRequestHandler is simply mocked. - // Therefore nothing is expected to be on the response for tests, so this verifies behavior. - DocList docList = cloud.getDocList(super.aftsRequestHandler, request, QUERY); - assertNull(docList); - - ArgumentCaptor response = ArgumentCaptor.forClass(SolrQueryResponse.class); - verify(super.aftsRequestHandler).handleRequest(eq(request), response.capture()); - assertNotNull(response.getValue()); - } - - @Test - public void testSelect() - { - SolrParams params = new ModifiableSolrParams(request.getParams()); - ResultContext rc = cloud.getResultContext(super.aftsRequestHandler, request, params); - assertNull(rc); - } - */ - -} diff --git a/search-services/alfresco-search/src/test/java/org/apache/lucene/analysis/minhash/MinHashFilterIT.java b/search-services/alfresco-search/src/test/java/org/apache/lucene/analysis/minhash/MinHashFilterIT.java deleted file mode 100644 index c936e639d..000000000 --- a/search-services/alfresco-search/src/test/java/org/apache/lucene/analysis/minhash/MinHashFilterIT.java +++ /dev/null @@ -1,567 +0,0 @@ -package org.apache.lucene.analysis.minhash; -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; - -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.BaseTokenStreamTestCase; -import org.apache.lucene.analysis.MockTokenizer; -import org.apache.lucene.analysis.TokenStream; -import org.apache.lucene.analysis.Tokenizer; -import org.apache.lucene.analysis.core.WhitespaceTokenizerFactory; -import org.apache.lucene.analysis.minhash.MinHashFilter.FixedSizeTreeSet; -import org.apache.lucene.analysis.minhash.MinHashFilter.LongPair; -import org.apache.lucene.analysis.shingle.ShingleFilterFactory; -import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; -import org.apache.lucene.analysis.util.CharFilterFactory; -import org.apache.lucene.analysis.util.TokenFilterFactory; -import org.apache.lucene.analysis.util.TokenizerFactory; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field.Store; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.DirectoryReader; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.Term; -import org.apache.lucene.search.BooleanClause.Occur; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.ConstantScoreQuery; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.TermQuery; -import org.apache.lucene.search.TopDocs; -import org.apache.lucene.store.RAMDirectory; -import org.apache.lucene.util.automaton.CharacterRunAutomaton; -import org.apache.lucene.util.automaton.RegExp; -import org.junit.Test; - -public class MinHashFilterIT extends BaseTokenStreamTestCase -{ - @Test - public void testIntHash() { - LongPair hash = new LongPair(); - MinHashFilter.murmurhash3_x64_128(MinHashFilter.getBytes(0), 0, 4, 0, hash); - assertEquals(-3485513579396041028L, hash.val1); - assertEquals(6383328099726337777L, hash.val2); - } - - @Test - public void testStringHash() throws UnsupportedEncodingException { - LongPair hash = new LongPair(); - byte[] bytes = "woof woof woof woof woof".getBytes("UTF-16LE"); - MinHashFilter.murmurhash3_x64_128(bytes, 0, bytes.length, 0, hash); - assertEquals(7638079586852243959L, hash.val1); - assertEquals(4378804943379391304L, hash.val2); - } - - @Test - public void testSimpleOrder() throws UnsupportedEncodingException { - LongPair hash1 = new LongPair(); - hash1.val1 = 1; - hash1.val2 = 2; - LongPair hash2 = new LongPair(); - hash2.val1 = 2; - hash2.val2 = 1; - assert (hash1.compareTo(hash2) > 0); - } - - - @Test - public void testHashOrder() { - assertTrue(!MinHashFilter.isLessThanUnsigned(0l, 0l)); - assertTrue(MinHashFilter.isLessThanUnsigned(0l, -1l)); - assertTrue(MinHashFilter.isLessThanUnsigned(1l, -1l)); - assertTrue(MinHashFilter.isLessThanUnsigned(-2l, -1l)); - assertTrue(MinHashFilter.isLessThanUnsigned(1l, 2l)); - assertTrue(MinHashFilter.isLessThanUnsigned(Long.MAX_VALUE, Long.MIN_VALUE)); - - FixedSizeTreeSet minSet = new FixedSizeTreeSet(500); - HashSet unadded = new HashSet(); - for (int i = 0; i < 100; i++) { - LongPair hash = new LongPair(); - MinHashFilter.murmurhash3_x64_128(MinHashFilter.getBytes(i), 0, 4, 0, hash); - LongPair peek = null; - if (minSet.size() > 0) { - peek = minSet.last(); - } - - if (!minSet.add(hash)) { - unadded.add(hash); - } else { - if (peek != null) { - if ((minSet.size() == 500) && !peek.equals(minSet.last())) { - unadded.add(peek); - } - } - } - } - assertEquals(100, minSet.size()); - assertEquals(0, unadded.size()); - - HashSet collisionDetection = new HashSet(); - unadded = new HashSet(); - minSet = new FixedSizeTreeSet(500); - for (int i = 0; i < 1000000; i++) { - LongPair hash = new LongPair(); - MinHashFilter.murmurhash3_x64_128(MinHashFilter.getBytes(i), 0, 4, 0, hash); - collisionDetection.add(hash); - LongPair peek = null; - if (minSet.size() > 0) { - peek = minSet.last(); - } - - if (!minSet.add(hash)) { - unadded.add(hash); - } else { - if (peek != null) { - if ((minSet.size() == 500) && !peek.equals(minSet.last())) { - unadded.add(peek); - } - } - } - } - assertEquals(1000000, collisionDetection.size()); - assertEquals(500, minSet.size()); - assertEquals(999500, unadded.size()); - - LongPair last = null; - LongPair current = null; - while ((current = minSet.pollLast()) != null) { - if (last != null) { - assertTrue(isLessThan(current, last)); - } else { - - } - last = current; - } - } - - - - @Test - public void testHashNotRepeated() { - FixedSizeTreeSet minSet = new FixedSizeTreeSet(500); - HashSet unadded = new HashSet(); - for (int i = 0; i < 10000; i++) { - LongPair hash = new LongPair(); - MinHashFilter.murmurhash3_x64_128(MinHashFilter.getBytes(i), 0, 4, 0, hash); - LongPair peek = null; - if (minSet.size() > 0) { - peek = minSet.last(); - } - if (!minSet.add(hash)) { - unadded.add(hash); - } else { - if (peek != null) { - if ((minSet.size() == 500) && !peek.equals(minSet.last())) { - unadded.add(peek); - } - } - } - } - assertEquals(500, minSet.size()); - - LongPair last = null; - LongPair current = null; - while ((current = minSet.pollLast()) != null) { - if (last != null) { - assertTrue(isLessThan(current, last)); - } else { - - } - last = current; - } - } - - @Test - public void testMockShingleTokenizer() throws IOException { - Tokenizer mockShingleTokenizer = createMockShingleTokenizer(5, - "woof woof woof woof woof" + " " + "woof woof woof woof puff"); - assertTokenStreamContents(mockShingleTokenizer, - new String[] {"woof woof woof woof woof", "woof woof woof woof puff"}); - } - - @Test - public void testTokenStreamSingleInput() throws IOException { - String[] hashes = new String[] {"℁팽徭聙↝ꇁ홱杯"}; - TokenStream ts = createTokenStream(5, "woof woof woof woof woof", 1, 1, 100, false); - assertTokenStreamContents(ts, hashes, new int[] {0}, - new int[] {24}, new String[] {MinHashFilter.MIN_HASH_TYPE}, new int[] {1}, new int[] {1}, 24, 0, null, - true); - - ts = createTokenStream(5, "woof woof woof woof woof", 2, 1, 1, false); - assertTokenStreamContents(ts, new String[] {new String(new char[] {0, 0, 8449, 54077, 64133, 32857, 8605, 41409}), - new String(new char[] {0, 1, 16887, 58164, 39536, 14926, 6529, 17276})}, new int[] {0, 0}, - new int[] {24, 24}, new String[] {MinHashFilter.MIN_HASH_TYPE, MinHashFilter.MIN_HASH_TYPE}, new int[] {1, 0}, new int[] {1, 1}, 24, 0, null, - true); - } - - @Test - public void testTokenStream1() throws IOException { - String[] hashes = new String[] {"℁팽徭聙↝ꇁ홱杯", - new String(new char[] {36347, 63457, 43013, 56843, 52284, 34231, 57934, 42302})}; - - TokenStream ts = createTokenStream(5, "woof woof woof woof woof" + " " + "woof woof woof woof puff", 1, 1, 100,false); - assertTokenStreamContents(ts, hashes, new int[] {0, 0}, - new int[] {49, 49}, new String[] {MinHashFilter.MIN_HASH_TYPE, MinHashFilter.MIN_HASH_TYPE}, new int[] {1, 0}, - new int[] {1, 1}, 49, 0, null, true); - } - - private ArrayList getTokens(TokenStream ts) throws IOException { - ArrayList tokens = new ArrayList(); - ts.reset(); - while (ts.incrementToken()) { - CharTermAttribute termAttribute = ts.getAttribute(CharTermAttribute.class); - String token = new String(termAttribute.buffer(), 0, termAttribute.length()); - tokens.add(token); - } - ts.end(); - ts.close(); - - return tokens; - } - - private ArrayList getTokens(Analyzer analyzer, String field, String value) throws IOException - { - ArrayList tokens = new ArrayList(); - - TokenStream ts = analyzer.tokenStream(field, value); - ts.reset(); - while(ts.incrementToken()) - { - CharTermAttribute termAttribute = ts.getAttribute(CharTermAttribute.class); - String token = new String(termAttribute.buffer(), 0, termAttribute.length()); - tokens.add(token); - } - ts.end(); - ts.close(); - - return tokens; - } - - @Test - public void testTokenStream2() throws IOException { - TokenStream ts = createTokenStream(5, "woof woof woof woof woof" + " " + "woof woof woof woof puff", 100, 1, 1, false); - ArrayList tokens = getTokens(ts); - ts.close(); - - assertEquals(100, tokens.size()); - } - - @Test - public void testTokenStream3() throws IOException { - TokenStream ts = createTokenStream(5, "woof woof woof woof woof" + " " + "woof woof woof woof puff", 10, 1, 10, false); - ArrayList tokens = getTokens(ts); - ts.close(); - - assertEquals(20, tokens.size()); - } - - @Test - public void testTokenStream4() throws IOException { - TokenStream ts = createTokenStream(5, "woof woof woof woof woof" + " " + "woof woof woof woof puff", 10, 10, 1, false); - ArrayList tokens = getTokens(ts); - ts.close(); - - assertEquals(20, tokens.size()); - - ts = createTokenStream(5, "woof woof woof woof woof" + " " + "woof woof woof woof puff", 10, 10, 1, true); - tokens = getTokens(ts); - ts.close(); - - assertEquals(100, tokens.size()); - - } - - @Test - public void testLSHQuery() throws IOException - { - Analyzer analyzer = createMinHashAnalyzer(5, 1, 100); - IndexWriterConfig config = new IndexWriterConfig(analyzer); - - RAMDirectory directory = new RAMDirectory(); - IndexWriter writer = new IndexWriter(directory, config); - Document doc = new Document(); - doc.add(new TextField("text", "woof woof woof woof woof", Store.NO)); - writer.addDocument(doc); - - doc = new Document(); - doc.add(new TextField("text", "woof woof woof woof woof puff", Store.NO)); - writer.addDocument(doc); - - doc = new Document(); - doc.add(new TextField("text", "woof woof woof woof puff", Store.NO)); - writer.addDocument(doc); - - writer.commit(); - writer.close(); - - IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory)); - - BooleanQuery.Builder builder = new BooleanQuery.Builder(); - builder.add(new ConstantScoreQuery(new TermQuery(new Term("text", "℁팽徭聙↝ꇁ홱杯"))), Occur.SHOULD); - builder.add(new ConstantScoreQuery(new TermQuery(new Term("text", new String(new char[] {36347, 63457, 43013, 56843, 52284, 34231, 57934, 42302})))), Occur.SHOULD); - builder.setDisableCoord(true); - TopDocs topDocs = searcher.search(builder.build(), 10); - - assertEquals(3, topDocs.totalHits); - - float score = topDocs.scoreDocs[0].score; - assertEquals(topDocs.scoreDocs[1].score, score/2, 0f); - assertEquals(topDocs.scoreDocs[2].score, score/2, 0f); - - } - - - - @Test - public void testLSHQuery2() throws IOException - { - String[] parts = new String[]{"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"}; - int min = 5; - - Analyzer analyzer = createMinHashAnalyzer(min, 1, 100); - IndexWriterConfig config = new IndexWriterConfig(analyzer); - - RAMDirectory directory = new RAMDirectory(); - IndexWriter writer = new IndexWriter(directory, config); - - for(int i = 0; i < parts.length; i++) - { - StringBuilder builder = new StringBuilder(); - for(int j = 0; j < parts.length -i; j++) - { - if(builder.length() > 0) - { - builder.append(" "); - } - builder.append(parts[i+j]); - if(j >= min -1) - { - Document doc = new Document(); - doc.add(new TextField("text", builder.toString(), Store.NO)); - writer.addDocument(doc); - } - } - } - - writer.commit(); - writer.close(); - - - IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory)); - - TopDocs topDocs = searcher.search(buildQuery("text", "one two three four five", min, 1, 100), 100); - assertEquals(6, topDocs.totalHits); - assertAllScores(topDocs, 1.0f); - topDocs = searcher.search(buildQuery("text", "two three four five six", min, 1, 100), 100); - assertEquals(10, topDocs.totalHits); - assertAllScores(topDocs, 1.0f); - topDocs = searcher.search(buildQuery("text", "three four five six seven", min, 1, 100), 100); - assertEquals(12, topDocs.totalHits); - assertAllScores(topDocs, 1.0f); - topDocs = searcher.search(buildQuery("text", "four five six seven eight", min, 1, 100), 100); - assertEquals(12, topDocs.totalHits); - assertAllScores(topDocs, 1.0f); - topDocs = searcher.search(buildQuery("text", "five six seven eight nine", min, 1, 100), 100); - assertEquals(10, topDocs.totalHits); - assertAllScores(topDocs, 1.0f); - topDocs = searcher.search(buildQuery("text", "six seven eight nine ten", min, 1, 100), 100); - assertEquals(6, topDocs.totalHits); - assertAllScores(topDocs, 1.0f); - - topDocs = searcher.search(buildQuery("text", "one two three four five six", min, 1, 100), 100); - assertEquals(11, topDocs.totalHits); - - topDocs = searcher.search(buildQuery("text", "one two three four five six seven eight nine ten", min, 1, 100), 100); - assertEquals(21, topDocs.totalHits); - for(int i = 0; i < topDocs.totalHits; i++) - { - System.out.println(i+" = "+topDocs.scoreDocs[i]); - } - - float topScore = 6.0f; - assertEquals(topDocs.scoreDocs[0].score, topScore, 0.001f); - assertEquals(topDocs.scoreDocs[1].score, topScore * 5/6, 0.001f); - assertEquals(topDocs.scoreDocs[2].score, topScore * 5/6, 0.001f); - assertEquals(topDocs.scoreDocs[3].score, topScore * 4/6, 0.001f); - assertEquals(topDocs.scoreDocs[4].score, topScore * 4/6, 0.001f); - assertEquals(topDocs.scoreDocs[5].score, topScore * 4/6, 0.001f); - assertEquals(topDocs.scoreDocs[6].score, topScore * 3/6, 0.001f); - assertEquals(topDocs.scoreDocs[7].score, topScore * 3/6, 0.001f); - assertEquals(topDocs.scoreDocs[8].score, topScore * 3/6, 0.001f); - assertEquals(topDocs.scoreDocs[9].score, topScore * 3/6, 0.001f); - assertEquals(topDocs.scoreDocs[10].score, topScore * 2/6, 0.001f); - assertEquals(topDocs.scoreDocs[11].score, topScore * 2/6, 0.001f); - assertEquals(topDocs.scoreDocs[12].score, topScore * 2/6, 0.001f); - assertEquals(topDocs.scoreDocs[13].score, topScore * 2/6, 0.001f); - assertEquals(topDocs.scoreDocs[14].score, topScore * 2/6, 0.001f); - assertEquals(topDocs.scoreDocs[15].score, topScore * 1/6, 0.001f); - assertEquals(topDocs.scoreDocs[16].score, topScore * 1/6, 0.001f); - assertEquals(topDocs.scoreDocs[17].score, topScore * 1/6, 0.001f); - assertEquals(topDocs.scoreDocs[18].score, topScore * 1/6, 0.001f); - assertEquals(topDocs.scoreDocs[19].score, topScore * 1/6, 0.001f); - assertEquals(topDocs.scoreDocs[20].score, topScore * 1/6, 0.001f); - - } - - - private void assertAllScores(TopDocs topDocs, float score) - { - for(int i = 0; i < topDocs.totalHits; i++) - { - assertEquals(topDocs.scoreDocs[i].score, score, 0f); - } - } - - private Query buildQuery(String field, String query, int min, int hashCount, int hashSetSize) throws IOException - { - TokenizerChain chain = createMinHashAnalyzer(min, hashCount, hashSetSize); - ArrayList tokens = getTokens(chain, field, query); - chain.close(); - - BooleanQuery.Builder builder = new BooleanQuery.Builder(); - for(String token : tokens) - { - builder.add(new ConstantScoreQuery(new TermQuery(new Term("text", token))), Occur.SHOULD); - } - builder.setDisableCoord(true); - return builder.build(); - } - - public static TokenStream createTokenStream(int shingleSize, String shingles, int hashCount, int bucketCount, int hashSetSize, boolean withRotation) { - Tokenizer tokenizer = createMockShingleTokenizer(shingleSize, shingles); - HashMap lshffargs = new HashMap(); - lshffargs.put("hashCount", "" + hashCount); - lshffargs.put("bucketCount", "" + bucketCount); - lshffargs.put("hashSetSize", "" + hashSetSize); - lshffargs.put("withRotation", "" + withRotation); - MinHashFilterFactory lshff = new MinHashFilterFactory(lshffargs); - return lshff.create(tokenizer); - } - - public static TokenizerChain createMinHashAnalyzer(int min, int hashCount, int hashSetSize) - { - WhitespaceTokenizerFactory icutf = new WhitespaceTokenizerFactory(Collections.emptyMap()); - HashMap sffargs = new HashMap(); - sffargs.put("minShingleSize", ""+min); - sffargs.put("maxShingleSize", ""+min); - sffargs.put("outputUnigrams", "false"); - sffargs.put("outputUnigramsIfNoShingles", "false"); - sffargs.put("tokenSeparator", " "); - ShingleFilterFactory sff = new ShingleFilterFactory(sffargs); - HashMap lshffargs = new HashMap(); - lshffargs.put("hashCount", ""+hashCount); - lshffargs.put("hashSetSize", ""+hashSetSize); - MinHashFilterFactory lshff = new MinHashFilterFactory(lshffargs); - - TokenizerChain chain = new TokenizerChain(new CharFilterFactory[]{}, icutf, new TokenFilterFactory[]{sff, lshff}); - return chain; - } - - public static Tokenizer createMockShingleTokenizer(int shingleSize, String shingles) { - MockTokenizer tokenizer = new MockTokenizer( - new CharacterRunAutomaton(new RegExp("[^ \t\r\n]+([ \t\r\n]+[^ \t\r\n]+){4}").toAutomaton()), - true); - tokenizer.setEnableChecks(true); - if (shingles != null) { - tokenizer.setReader(new StringReader(shingles)); - } - return tokenizer; - } - - private boolean isLessThan(LongPair hash1, LongPair hash2) { - if (MinHashFilter.isLessThanUnsigned(hash1.val2, hash2.val2)) { - return true; - } else if (hash1.val2 == hash2.val2) { - return (MinHashFilter.isLessThanUnsigned(hash1.val1, hash2.val1)); - } else { - return false; - } - } - - - /** - * An analyzer that uses a tokenizer and a list of token filters to - * create a TokenStream - lifted from SOLR to make this analyzer test lucene only. - */ - public static class TokenizerChain extends Analyzer { - - final private CharFilterFactory[] charFilters; - final private TokenizerFactory tokenizer; - final private TokenFilterFactory[] filters; - - - /** - * Creates a new TokenizerChain. - * - * @param charFilters Factories for the CharFilters to use, if any - if null, will be treated as if empty. - * @param tokenizer Factory for the Tokenizer to use, must not be null. - * @param filters Factories for the TokenFilters to use if any- if null, will be treated as if empty. - */ - public TokenizerChain(CharFilterFactory[] charFilters, TokenizerFactory tokenizer, TokenFilterFactory[] filters) { - this.charFilters = charFilters; - this.tokenizer = tokenizer; - this.filters = filters; - } - - @Override - public Reader initReader(String fieldName, Reader reader) { - if (charFilters != null && charFilters.length > 0) { - Reader cs = reader; - for (CharFilterFactory charFilter : charFilters) { - cs = charFilter.create(cs); - } - reader = cs; - } - return reader; - } - - @Override - protected TokenStreamComponents createComponents(String fieldName) { - Tokenizer tk = tokenizer.create(); - TokenStream ts = tk; - for (TokenFilterFactory filter : filters) { - ts = filter.create(ts); - } - return new TokenStreamComponents(tk, ts); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("TokenizerChain("); - for (CharFilterFactory filter: charFilters) { - sb.append(filter); - sb.append(", "); - } - sb.append(tokenizer); - for (TokenFilterFactory filter: filters) { - sb.append(", "); - sb.append(filter); - } - sb.append(')'); - return sb.toString(); - } - } -} diff --git a/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModel.java b/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModel.java index faffa907d..a979d1094 100644 --- a/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModel.java +++ b/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModel.java @@ -1,28 +1,28 @@ -/* - * #%L - * Alfresco Solr Client - * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ +/* + * #%L + * Alfresco Solr Client + * %% + * Copyright (C) 2005 - 2016 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ package org.alfresco.solr.client; import org.alfresco.repo.dictionary.M2Model; @@ -52,7 +52,8 @@ public class AlfrescoModel { return checksum; } - + + @Override public boolean equals(Object other) { if (this == other) @@ -70,7 +71,8 @@ public class AlfrescoModel checksum.equals(model.getChecksum())); } - public int hashcode() + @Override + public int hashCode() { int result = 17; result = 31 * result + model.hashCode(); diff --git a/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModelDiff.java b/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModelDiff.java index 1b97a4445..ea9ae61d8 100644 --- a/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModelDiff.java +++ b/search-services/alfresco-solrclient-lib/src/main/java/org/alfresco/solr/client/AlfrescoModelDiff.java @@ -1,28 +1,28 @@ -/* - * #%L - * Alfresco Solr Client - * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ +/* + * #%L + * Alfresco Solr Client + * %% + * Copyright (C) 2005 - 2016 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ package org.alfresco.solr.client; import org.alfresco.service.namespace.QName; @@ -36,10 +36,10 @@ import org.alfresco.service.namespace.QName; */ public class AlfrescoModelDiff { - public static enum TYPE + public enum TYPE { NEW, CHANGED, REMOVED; - }; + } private QName modelName; private TYPE type; @@ -74,7 +74,8 @@ public class AlfrescoModelDiff { return newChecksum; } - + + @Override public boolean equals(Object other) { if(this == other) @@ -91,8 +92,9 @@ public class AlfrescoModelDiff diff.getOldChecksum().equals(getOldChecksum()) && diff.getNewChecksum().equals(getNewChecksum())); } - - public int hashcode() + + @Override + public int hashCode() { int result = 17; result = 31 * result + getModelName().hashCode();