You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2021/01/05 12:45:05 UTC
[lucene-solr] 01/02: LUCENE-9570: code reformatting [final].
This is an automated email from the ASF dual-hosted git repository.
dweiss pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
commit 2cbf261032dc8aca56c846971c090c991ac594a6
Author: Dawid Weiss <da...@carrotsearch.com>
AuthorDate: Tue Jan 5 13:44:05 2021 +0100
LUCENE-9570: code reformatting [final].
---
gradle/generation/javacc.gradle | 17 +-
gradle/validation/spotless.gradle | 107 +-
lucene/CHANGES.txt | 4 +
.../java/org/apache/lucene/search/HitQueue.java | 7 +-
.../org/apache/lucene/store/NIOFSDirectory.java | 8 +-
.../search/grouping/AllGroupHeadsCollector.java | 84 +-
.../lucene/search/grouping/AllGroupsCollector.java | 23 +-
.../search/grouping/BlockGroupingCollector.java | 193 +-
.../search/grouping/CollectedSearchGroup.java | 10 +-
.../search/grouping/DistinctValuesCollector.java | 27 +-
.../apache/lucene/search/grouping/DoubleRange.java | 10 +-
.../lucene/search/grouping/DoubleRangeFactory.java | 20 +-
.../search/grouping/DoubleRangeGroupSelector.java | 16 +-
.../grouping/FirstPassGroupingCollector.java | 100 +-
.../apache/lucene/search/grouping/GroupDocs.java | 40 +-
.../search/grouping/GroupFacetCollector.java | 93 +-
.../lucene/search/grouping/GroupReducer.java | 35 +-
.../lucene/search/grouping/GroupSelector.java | 39 +-
.../lucene/search/grouping/GroupingSearch.java | 135 +-
.../apache/lucene/search/grouping/LongRange.java | 9 +-
.../lucene/search/grouping/LongRangeFactory.java | 20 +-
.../search/grouping/LongRangeGroupSelector.java | 16 +-
.../apache/lucene/search/grouping/SearchGroup.java | 103 +-
.../grouping/SecondPassGroupingCollector.java | 28 +-
.../search/grouping/TermGroupFacetCollector.java | 113 +-
.../lucene/search/grouping/TermGroupSelector.java | 25 +-
.../apache/lucene/search/grouping/TopGroups.java | 176 +-
.../lucene/search/grouping/TopGroupsCollector.java | 106 +-
.../search/grouping/ValueSourceGroupSelector.java | 13 +-
.../lucene/search/grouping/package-info.java | 187 +-
.../search/grouping/AbstractGroupingTestCase.java | 17 +-
.../search/grouping/BaseGroupSelectorTestCase.java | 128 +-
.../grouping/TestAllGroupHeadsCollector.java | 188 +-
.../search/grouping/TestAllGroupsCollector.java | 14 +-
.../lucene/search/grouping/TestBlockGrouping.java | 60 +-
.../grouping/TestDistinctValuesCollector.java | 176 +-
.../search/grouping/TestDoubleRangeFactory.java | 2 -
.../grouping/TestDoubleRangeGroupSelector.java | 6 +-
.../search/grouping/TestGroupFacetCollector.java | 259 +-
.../lucene/search/grouping/TestGrouping.java | 798 ++++--
.../lucene/search/grouping/TestGroupingSearch.java | 38 +-
.../search/grouping/TestLongRangeFactory.java | 2 -
.../grouping/TestLongRangeGroupSelector.java | 4 +-
.../search/grouping/TestTermGroupSelector.java | 2 +-
.../lucene/search/grouping/TestTopGroups.java | 153 +-
.../grouping/TestValueSourceGroupSelector.java | 1 -
.../apache/lucene/luke/app/AbstractHandler.java | 2 -
.../apache/lucene/luke/app/DirectoryHandler.java | 5 +-
.../apache/lucene/luke/app/DirectoryObserver.java | 1 -
.../org/apache/lucene/luke/app/IndexHandler.java | 18 +-
.../org/apache/lucene/luke/app/IndexObserver.java | 1 -
.../java/org/apache/lucene/luke/app/LukeState.java | 5 +-
.../java/org/apache/lucene/luke/app/Observer.java | 3 +-
.../apache/lucene/luke/app/desktop/LukeMain.java | 38 +-
.../lucene/luke/app/desktop/MessageBroker.java | 1 -
.../lucene/luke/app/desktop/Preferences.java | 8 +-
.../luke/app/desktop/PreferencesFactory.java | 3 +-
.../lucene/luke/app/desktop/PreferencesImpl.java | 14 +-
.../desktop/components/AnalysisPanelProvider.java | 185 +-
.../desktop/components/AnalysisTabOperator.java | 2 -
.../desktop/components/CommitsPanelProvider.java | 204 +-
.../components/ComponentOperatorRegistry.java | 4 +-
.../desktop/components/DocumentsPanelProvider.java | 345 ++-
.../desktop/components/DocumentsTabOperator.java | 2 +-
.../app/desktop/components/LogsPanelProvider.java | 6 +-
.../app/desktop/components/LukeWindowProvider.java | 33 +-
.../app/desktop/components/MenuBarProvider.java | 45 +-
.../desktop/components/OverviewPanelProvider.java | 172 +-
.../desktop/components/SearchPanelProvider.java | 344 ++-
.../app/desktop/components/TabSwitcherProxy.java | 1 -
.../app/desktop/components/TabbedPaneProvider.java | 10 +-
.../app/desktop/components/TableColumnInfo.java | 1 -
.../app/desktop/components/TableModelBase.java | 9 +-
.../components/dialog/ConfirmDialogFactory.java | 23 +-
.../components/dialog/HelpDialogFactory.java | 15 +-
.../analysis/AnalysisChainDialogFactory.java | 50 +-
.../dialog/analysis/EditFiltersDialogFactory.java | 140 +-
.../dialog/analysis/EditFiltersMode.java | 3 +-
.../dialog/analysis/EditParamsDialogFactory.java | 106 +-
.../components/dialog/analysis/EditParamsMode.java | 4 +-
.../analysis/TokenAttributeDialogFactory.java | 40 +-
.../components/dialog/analysis/package-info.java | 2 +-
.../dialog/documents/AddDocumentDialogFactory.java | 254 +-
.../documents/AddDocumentDialogOperator.java | 1 -
.../dialog/documents/DocValuesDialogFactory.java | 64 +-
.../documents/IndexOptionsDialogFactory.java | 27 +-
.../dialog/documents/StoredValueDialogFactory.java | 34 +-
.../dialog/documents/TermVectorDialogFactory.java | 65 +-
.../components/dialog/documents/package-info.java | 2 +-
.../dialog/menubar/AboutDialogFactory.java | 104 +-
.../dialog/menubar/CheckIndexDialogFactory.java | 187 +-
.../dialog/menubar/CreateIndexDialogFactory.java | 160 +-
.../dialog/menubar/ExportTermsDialogFactory.java | 135 +-
.../dialog/menubar/OpenIndexDialogFactory.java | 76 +-
.../dialog/menubar/OptimizeIndexDialogFactory.java | 101 +-
.../components/dialog/menubar/package-info.java | 2 +-
.../desktop/components/dialog/package-info.java | 2 +-
.../dialog/search/ExplainDialogFactory.java | 38 +-
.../components/dialog/search/package-info.java | 2 +-
.../analysis/CustomAnalyzerPanelOperator.java | 1 -
.../analysis/CustomAnalyzerPanelProvider.java | 267 +-
.../analysis/PresetAnalyzerPanelOperator.java | 1 -
.../analysis/PresetAnalyzerPanelProvider.java | 20 +-
.../analysis/SimpleAnalyzeResultPanelOperator.java | 4 +-
.../analysis/SimpleAnalyzeResultPanelProvider.java | 55 +-
.../StepByStepAnalyzeResultPanelOperator.java | 3 +-
.../StepByStepAnalyzeResultPanelProvider.java | 99 +-
.../fragments/analysis/package-info.java | 2 +-
.../desktop/components/fragments/package-info.java | 2 +-
.../fragments/search/AnalyzerPaneProvider.java | 43 +-
.../fragments/search/AnalyzerTabOperator.java | 1 -
.../fragments/search/FieldValuesPaneProvider.java | 37 +-
.../fragments/search/FieldValuesTabOperator.java | 1 -
.../fragments/search/MLTPaneProvider.java | 59 +-
.../fragments/search/MLTTabOperator.java | 1 -
.../fragments/search/QueryParserPaneProvider.java | 109 +-
.../fragments/search/QueryParserTabOperator.java | 2 -
.../fragments/search/SimilarityPaneProvider.java | 18 +-
.../fragments/search/SortPaneProvider.java | 75 +-
.../fragments/search/SortTabOperator.java | 2 -
.../components/fragments/search/package-info.java | 2 +-
.../luke/app/desktop/components/package-info.java | 2 +-
.../luke/app/desktop/dto/documents/NewField.java | 5 +-
.../app/desktop/dto/documents/package-info.java | 2 +-
.../lucene/luke/app/desktop/package-info.java | 2 +-
.../lucene/luke/app/desktop/util/DialogOpener.java | 17 +-
.../luke/app/desktop/util/ExceptionHandler.java | 2 -
.../lucene/luke/app/desktop/util/FontUtils.java | 13 +-
.../luke/app/desktop/util/HelpHeaderRenderer.java | 67 +-
.../lucene/luke/app/desktop/util/ImageUtils.java | 9 +-
.../lucene/luke/app/desktop/util/ListUtils.java | 8 +-
.../lucene/luke/app/desktop/util/MessageUtils.java | 41 +-
.../lucene/luke/app/desktop/util/NumericUtils.java | 31 +-
.../lucene/luke/app/desktop/util/StringUtils.java | 3 +-
.../luke/app/desktop/util/StyleConstants.java | 4 +-
.../lucene/luke/app/desktop/util/TabUtils.java | 12 +-
.../lucene/luke/app/desktop/util/TableUtils.java | 27 +-
.../luke/app/desktop/util/TextAreaAppender.java | 28 +-
.../luke/app/desktop/util/TextAreaPrintStream.java | 2 +-
.../lucene/luke/app/desktop/util/URLLabel.java | 16 +-
.../luke/app/desktop/util/inifile/IniFile.java | 1 -
.../app/desktop/util/inifile/IniFileReader.java | 1 -
.../app/desktop/util/inifile/IniFileWriter.java | 1 -
.../luke/app/desktop/util/inifile/OptionMap.java | 1 -
.../app/desktop/util/inifile/SimpleIniFile.java | 4 +-
.../desktop/util/inifile/SimpleIniFileReader.java | 39 +-
.../app/desktop/util/inifile/package-info.java | 2 +-
.../luke/app/desktop/util/lang/package-info.java | 2 +-
.../lucene/luke/app/desktop/util/package-info.java | 2 +-
.../org/apache/lucene/luke/app/package-info.java | 2 +-
.../apache/lucene/luke/models/LukeException.java | 1 -
.../org/apache/lucene/luke/models/LukeModel.java | 7 +-
.../lucene/luke/models/analysis/Analysis.java | 70 +-
.../luke/models/analysis/AnalysisFactory.java | 1 -
.../lucene/luke/models/analysis/AnalysisImpl.java | 84 +-
.../luke/models/analysis/CustomAnalyzerConfig.java | 20 +-
.../lucene/luke/models/analysis/package-info.java | 2 +-
.../apache/lucene/luke/models/commits/Commit.java | 8 +-
.../apache/lucene/luke/models/commits/Commits.java | 12 +-
.../lucene/luke/models/commits/CommitsFactory.java | 1 -
.../lucene/luke/models/commits/CommitsImpl.java | 39 +-
.../apache/lucene/luke/models/commits/File.java | 7 +-
.../apache/lucene/luke/models/commits/Segment.java | 8 +-
.../lucene/luke/models/commits/package-info.java | 2 +-
.../lucene/luke/models/documents/DocValues.java | 35 +-
.../luke/models/documents/DocValuesAdapter.java | 58 +-
.../luke/models/documents/DocumentField.java | 38 +-
.../lucene/luke/models/documents/Documents.java | 58 +-
.../luke/models/documents/DocumentsFactory.java | 1 -
.../luke/models/documents/DocumentsImpl.java | 48 +-
.../lucene/luke/models/documents/TermPosting.java | 24 +-
.../luke/models/documents/TermVectorEntry.java | 70 +-
.../luke/models/documents/TermVectorsAdapter.java | 10 +-
.../lucene/luke/models/documents/package-info.java | 2 +-
.../lucene/luke/models/overview/Overview.java | 57 +-
.../luke/models/overview/OverviewFactory.java | 1 -
.../lucene/luke/models/overview/OverviewImpl.java | 18 +-
.../lucene/luke/models/overview/TermCounts.java | 17 +-
.../luke/models/overview/TermCountsOrder.java | 20 +-
.../lucene/luke/models/overview/TermStats.java | 34 +-
.../lucene/luke/models/overview/TopTerms.java | 13 +-
.../lucene/luke/models/overview/package-info.java | 2 +-
.../apache/lucene/luke/models/package-info.java | 2 +-
.../lucene/luke/models/search/MLTConfig.java | 6 +-
.../luke/models/search/QueryParserConfig.java | 63 +-
.../apache/lucene/luke/models/search/Search.java | 47 +-
.../lucene/luke/models/search/SearchFactory.java | 1 -
.../lucene/luke/models/search/SearchImpl.java | 114 +-
.../lucene/luke/models/search/SearchResults.java | 58 +-
.../luke/models/search/SimilarityConfig.java | 26 +-
.../lucene/luke/models/search/package-info.java | 2 +-
.../lucene/luke/models/tools/IndexTools.java | 15 +-
.../luke/models/tools/IndexToolsFactory.java | 1 -
.../lucene/luke/models/tools/IndexToolsImpl.java | 23 +-
.../lucene/luke/models/tools/package-info.java | 2 +-
.../apache/lucene/luke/models/util/IndexUtils.java | 93 +-
.../lucene/luke/models/util/package-info.java | 2 +-
.../luke/models/util/twentynewsgroups/Message.java | 8 +-
.../util/twentynewsgroups/MessageFilesParser.java | 12 +-
.../models/util/twentynewsgroups/package-info.java | 2 +-
.../java/org/apache/lucene/luke/package-info.java | 2 +-
.../org/apache/lucene/luke/util/BytesRefUtils.java | 7 +-
.../org/apache/lucene/luke/util/LoggerFactory.java | 37 +-
.../org/apache/lucene/luke/util/package-info.java | 2 +-
.../lucene/luke/util/reflection/ClassScanner.java | 10 +-
.../luke/util/reflection/SubtypeCollector.java | 8 +-
.../lucene/luke/util/reflection/package-info.java | 2 +-
.../desktop/util/inifile/SimpleIniFileTest.java | 1 -
.../luke/models/analysis/AnalysisImplTest.java | 60 +-
.../luke/models/commits/CommitsImplTest.java | 10 +-
.../models/documents/DocValuesAdapterTest.java | 16 +-
.../luke/models/documents/DocumentsImplTest.java | 7 +-
.../luke/models/documents/DocumentsTestBase.java | 34 +-
.../models/documents/TermVectorsAdapterTest.java | 4 +-
.../luke/models/overview/OverviewImplTest.java | 8 +-
.../luke/models/overview/OverviewTestBase.java | 4 +-
.../luke/models/overview/TermCountsTest.java | 4 +-
.../lucene/luke/models/overview/TopTermsTest.java | 2 -
.../lucene/luke/models/search/SearchImplTest.java | 111 +-
.../apache/lucene/misc/CollectorMemoryTracker.java | 5 +-
.../java/org/apache/lucene/misc/GetTermInfo.java | 38 +-
.../java/org/apache/lucene/misc/HighFreqTerms.java | 88 +-
.../org/apache/lucene/misc/IndexMergeTool.java | 42 +-
.../apache/lucene/misc/SweetSpotSimilarity.java | 165 +-
.../src/java/org/apache/lucene/misc/TermStats.java | 18 +-
.../apache/lucene/misc/document/LazyDocument.java | 63 +-
.../apache/lucene/misc/document/package-info.java | 2 +-
.../apache/lucene/misc/index/IndexSplitter.java | 65 +-
.../lucene/misc/index/MultiPassIndexSplitter.java | 71 +-
.../apache/lucene/misc/index/PKIndexSplitter.java | 82 +-
.../org/apache/lucene/misc/index/package-info.java | 2 +-
.../java/org/apache/lucene/misc/package-info.java | 4 +-
.../misc/search/DiversifiedTopDocsCollector.java | 81 +-
.../apache/lucene/misc/search/DocValuesStats.java | 43 +-
.../misc/search/DocValuesStatsCollector.java | 15 +-
.../search/MemoryAccountingBitsetCollector.java | 1 -
.../apache/lucene/misc/search/package-info.java | 2 +-
.../search/similarity/LegacyBM25Similarity.java | 31 +-
.../misc/search/similarity/package-info.java | 2 +-
.../misc/store/HardlinkCopyDirectoryWrapper.java | 78 +-
.../apache/lucene/misc/store/NativePosixUtil.java | 33 +-
.../lucene/misc/store/NativeUnixDirectory.java | 180 +-
.../org/apache/lucene/misc/store/RAFDirectory.java | 95 +-
.../apache/lucene/misc/store/WindowsDirectory.java | 66 +-
.../org/apache/lucene/misc/store/package-info.java | 2 +-
.../org/apache/lucene/misc/util/MemoryTracker.java | 5 +-
.../apache/lucene/misc/util/fst/ListOfOutputs.java | 66 +-
.../misc/util/fst/UpToTwoPositiveIntOutputs.java | 48 +-
.../apache/lucene/misc/util/fst/package-info.java | 2 +-
.../org/apache/lucene/misc/util/package-info.java | 5 +-
.../lucene/misc/SweetSpotSimilarityTest.java | 199 +-
.../org/apache/lucene/misc/TestHighFreqTerms.java | 183 +-
.../org/apache/lucene/misc/TestIndexMergeTool.java | 40 +-
.../lucene/misc/document/TestLazyDocument.java | 80 +-
.../lucene/misc/index/TestIndexSplitter.java | 31 +-
.../misc/index/TestMultiPassIndexSplitter.java | 44 +-
.../lucene/misc/index/TestPKIndexSplitter.java | 67 +-
.../search/TestDiversifiedTopDocsCollector.java | 298 +--
.../misc/search/TestDocValuesStatsCollector.java | 47 +-
.../TestMemoryAccountingBitsetCollector.java | 14 +-
.../similarity/TestLegacyBM25Similarity.java | 64 +-
.../lucene/misc/store/NativeLibEnableRule.java | 9 +-
.../lucene/misc/store/NativeUnixDirectoryTest.java | 20 +-
.../store/TestHardLinkCopyDirectoryWrapper.java | 30 +-
.../apache/lucene/misc/store/TestRAFDirectory.java | 12 +-
.../lucene/misc/store/WindowsDirectoryTest.java | 11 +-
.../misc/util/TestCollectorMemoryTracker.java | 22 +-
.../apache/lucene/misc/util/fst/TestFSTsMisc.java | 31 +-
.../apache/lucene/monitor/CandidateMatcher.java | 60 +-
.../apache/lucene/monitor/CollectingMatcher.java | 9 +-
.../lucene/monitor/ConcurrentQueryLoader.java | 59 +-
.../apache/lucene/monitor/CustomQueryHandler.java | 15 +-
.../org/apache/lucene/monitor/DocumentBatch.java | 11 +-
.../org/apache/lucene/monitor/ExplainingMatch.java | 54 +-
.../lucene/monitor/ForceNoBulkScoringQuery.java | 12 +-
.../org/apache/lucene/monitor/HighlightsMatch.java | 144 +-
.../org/apache/lucene/monitor/MatcherFactory.java | 5 +-
.../org/apache/lucene/monitor/MatchingQueries.java | 33 +-
.../java/org/apache/lucene/monitor/Monitor.java | 159 +-
.../lucene/monitor/MonitorConfiguration.java | 30 +-
.../org/apache/lucene/monitor/MonitorQuery.java | 44 +-
.../lucene/monitor/MonitorQuerySerializer.java | 22 +-
.../lucene/monitor/MonitorUpdateListener.java | 40 +-
.../lucene/monitor/MultiMatchingQueries.java | 37 +-
.../monitor/MultipassTermFilteredPresearcher.java | 77 +-
.../org/apache/lucene/monitor/ParallelMatcher.java | 64 +-
.../apache/lucene/monitor/PartitionMatcher.java | 58 +-
.../org/apache/lucene/monitor/Presearcher.java | 41 +-
.../apache/lucene/monitor/PresearcherMatch.java | 12 +-
.../apache/lucene/monitor/PresearcherMatches.java | 12 +-
.../org/apache/lucene/monitor/QueryAnalyzer.java | 41 +-
.../org/apache/lucene/monitor/QueryCacheEntry.java | 21 +-
.../org/apache/lucene/monitor/QueryDecomposer.java | 24 +-
.../java/org/apache/lucene/monitor/QueryIndex.java | 86 +-
.../java/org/apache/lucene/monitor/QueryMatch.java | 30 +-
.../apache/lucene/monitor/QueryTimeListener.java | 20 +-
.../java/org/apache/lucene/monitor/QueryTree.java | 77 +-
.../apache/lucene/monitor/RegexpQueryHandler.java | 44 +-
.../org/apache/lucene/monitor/ScoringMatch.java | 15 +-
.../java/org/apache/lucene/monitor/SlowLog.java | 22 +-
.../lucene/monitor/SuffixingNGramTokenFilter.java | 29 +-
.../lucene/monitor/TermFilteredPresearcher.java | 126 +-
.../org/apache/lucene/monitor/TermWeightor.java | 48 +-
.../lucene/monitor/TermsEnumTokenStream.java | 8 +-
.../org/apache/lucene/monitor/package-info.java | 135 +-
.../lucene/monitor/ConcurrentMatcherTestBase.java | 23 +-
.../FieldFilterPresearcherComponentTestBase.java | 22 +-
.../org/apache/lucene/monitor/MonitorTestBase.java | 1 -
.../apache/lucene/monitor/PresearcherTestBase.java | 51 +-
.../monitor/TestBooleanClauseWeightings.java | 36 +-
.../lucene/monitor/TestBooleanTermExtractor.java | 16 +-
.../apache/lucene/monitor/TestCachePurging.java | 76 +-
.../lucene/monitor/TestConcurrentQueryLoader.java | 1 -
.../apache/lucene/monitor/TestDocumentBatch.java | 17 +-
.../lucene/monitor/TestExplainingMatcher.java | 4 +-
.../org/apache/lucene/monitor/TestExtractors.java | 26 +-
.../TestFieldFilteredMultipassPresearcher.java | 4 +-
.../monitor/TestFieldTermFilteredPresearcher.java | 3 +-
.../monitor/TestForceNoBulkScoringQuery.java | 11 +-
.../lucene/monitor/TestHighlightingMatcher.java | 319 +--
.../lucene/monitor/TestMatchAllPresearcher.java | 1 -
.../org/apache/lucene/monitor/TestMonitor.java | 105 +-
.../lucene/monitor/TestMonitorErrorHandling.java | 15 +-
.../lucene/monitor/TestMonitorPersistence.java | 29 +-
.../lucene/monitor/TestMultipassPresearcher.java | 67 +-
.../apache/lucene/monitor/TestParallelMatcher.java | 3 +-
.../lucene/monitor/TestPartitionMatcher.java | 4 +-
.../monitor/TestPresearcherMatchCollector.java | 6 +-
.../apache/lucene/monitor/TestQueryAnalyzer.java | 74 +-
.../apache/lucene/monitor/TestQueryDecomposer.java | 44 +-
.../lucene/monitor/TestQueryTermComparators.java | 17 +-
.../apache/lucene/monitor/TestQueryTermFilter.java | 12 +-
.../lucene/monitor/TestRegexpQueryHandler.java | 68 +-
.../apache/lucene/monitor/TestSimilarities.java | 19 +-
.../apache/lucene/monitor/TestSimpleMatcher.java | 4 +-
.../apache/lucene/monitor/TestSpanExtractors.java | 66 +-
.../monitor/TestSuffixingNGramTokenizer.java | 61 +-
.../apache/lucene/monitor/TestTermPresearcher.java | 62 +-
.../lucene/monitor/TestTermsEnumTokenFilter.java | 23 +-
.../monitor/TestWildcardTermPresearcher.java | 36 +-
.../lucene/queryparser/charstream/CharStream.java | 77 +-
.../queryparser/charstream/FastCharStream.java | 43 +-
.../queryparser/charstream/package-info.java | 4 +-
.../queryparser/classic/MultiFieldQueryParser.java | 193 +-
.../queryparser/classic/QueryParserBase.java | 542 ++--
.../lucene/queryparser/classic/package-info.java | 481 ++--
.../complexPhrase/ComplexPhraseQueryParser.java | 157 +-
.../queryparser/complexPhrase/package-info.java | 7 +-
.../queryparser/ext/ExtendableQueryParser.java | 102 +-
.../lucene/queryparser/ext/ExtensionQuery.java | 23 +-
.../apache/lucene/queryparser/ext/Extensions.java | 184 +-
.../lucene/queryparser/ext/ParserExtension.java | 35 +-
.../lucene/queryparser/ext/package-info.java | 8 +-
.../queryparser/flexible/core/QueryNodeError.java | 23 +-
.../flexible/core/QueryNodeException.java | 20 +-
.../flexible/core/QueryNodeParseException.java | 46 +-
.../flexible/core/QueryParserHelper.java | 163 +-
.../flexible/core/builders/QueryBuilder.java | 12 +-
.../flexible/core/builders/QueryTreeBuilder.java | 99 +-
.../flexible/core/builders/package-info.java | 16 +-
.../flexible/core/config/AbstractQueryConfig.java | 58 +-
.../flexible/core/config/ConfigurationKey.java | 17 +-
.../flexible/core/config/FieldConfig.java | 19 +-
.../flexible/core/config/FieldConfigListener.java | 14 +-
.../flexible/core/config/QueryConfigHandler.java | 54 +-
.../flexible/core/config/package-info.java | 28 +-
.../core/messages/QueryParserMessages.java | 5 +-
.../flexible/core/messages/package-info.java | 9 +-
.../flexible/core/nodes/AndQueryNode.java | 31 +-
.../flexible/core/nodes/AnyQueryNode.java | 49 +-
.../flexible/core/nodes/BooleanQueryNode.java | 28 +-
.../flexible/core/nodes/BoostQueryNode.java | 48 +-
.../flexible/core/nodes/DeletedQueryNode.java | 8 +-
.../flexible/core/nodes/FieldQueryNode.java | 89 +-
.../core/nodes/FieldValuePairQueryNode.java | 12 +-
.../flexible/core/nodes/FieldableNode.java | 19 +-
.../flexible/core/nodes/FuzzyQueryNode.java | 43 +-
.../flexible/core/nodes/GroupQueryNode.java | 24 +-
.../flexible/core/nodes/MatchAllDocsQueryNode.java | 4 +-
.../flexible/core/nodes/MatchNoDocsQueryNode.java | 6 +-
.../flexible/core/nodes/ModifierQueryNode.java | 92 +-
.../flexible/core/nodes/NoTokenFoundQueryNode.java | 4 +-
.../flexible/core/nodes/OpaqueQueryNode.java | 22 +-
.../flexible/core/nodes/OrQueryNode.java | 30 +-
.../flexible/core/nodes/PathQueryNode.java | 87 +-
.../flexible/core/nodes/PhraseSlopQueryNode.java | 40 +-
.../flexible/core/nodes/ProximityQueryNode.java | 140 +-
.../queryparser/flexible/core/nodes/QueryNode.java | 47 +-
.../flexible/core/nodes/QueryNodeImpl.java | 68 +-
.../flexible/core/nodes/QuotedFieldQueryNode.java | 32 +-
.../flexible/core/nodes/RangeQueryNode.java | 15 +-
.../flexible/core/nodes/SlopQueryNode.java | 46 +-
.../flexible/core/nodes/TextableQueryNode.java | 5 +-
.../core/nodes/TokenizedPhraseQueryNode.java | 18 +-
.../flexible/core/nodes/ValueQueryNode.java | 10 +-
.../flexible/core/nodes/package-info.java | 108 +-
.../queryparser/flexible/core/package-info.java | 54 +-
.../flexible/core/parser/EscapeQuerySyntax.java | 20 +-
.../flexible/core/parser/SyntaxParser.java | 13 +-
.../flexible/core/parser/package-info.java | 29 +-
.../NoChildOptimizationQueryNodeProcessor.java | 31 +-
.../core/processors/QueryNodeProcessor.java | 52 +-
.../core/processors/QueryNodeProcessorImpl.java | 119 +-
.../processors/QueryNodeProcessorPipeline.java | 160 +-
.../RemoveDeletedQueryNodesProcessor.java | 27 +-
.../flexible/core/processors/package-info.java | 48 +-
.../flexible/core/util/QueryNodeOperation.java | 86 +-
.../flexible/core/util/StringUtils.java | 12 +-
.../flexible/core/util/UnescapedCharSequence.java | 45 +-
.../flexible/core/util/package-info.java | 10 +-
.../queryparser/flexible/messages/Message.java | 5 +-
.../queryparser/flexible/messages/MessageImpl.java | 6 +-
.../lucene/queryparser/flexible/messages/NLS.java | 69 +-
.../flexible/messages/NLSException.java | 14 +-
.../flexible/messages/package-info.java | 73 +-
.../flexible/precedence/PrecedenceQueryParser.java | 36 +-
.../flexible/precedence/package-info.java | 22 +-
.../BooleanModifiersQueryNodeProcessor.java | 45 +-
.../PrecedenceQueryNodeProcessorPipeline.java | 32 +-
.../precedence/processors/package-info.java | 38 +-
.../standard/CommonQueryParserConfiguration.java | 133 +-
.../flexible/standard/QueryParserUtil.java | 119 +-
.../flexible/standard/StandardQueryParser.java | 347 ++-
.../standard/builders/AnyQueryNodeBuilder.java | 22 +-
.../standard/builders/BooleanQueryNodeBuilder.java | 48 +-
.../standard/builders/BoostQueryNodeBuilder.java | 12 +-
.../standard/builders/DummyQueryNodeBuilder.java | 15 +-
.../standard/builders/FieldQueryNodeBuilder.java | 9 +-
.../standard/builders/FuzzyQueryNodeBuilder.java | 19 +-
.../standard/builders/GroupQueryNodeBuilder.java | 10 +-
.../builders/MatchAllDocsQueryNodeBuilder.java | 18 +-
.../builders/MatchNoDocsQueryNodeBuilder.java | 16 +-
.../builders/ModifierQueryNodeBuilder.java | 10 +-
.../builders/MultiPhraseQueryNodeBuilder.java | 18 +-
.../standard/builders/PhraseQueryNodeBuilder.java | 12 +-
.../builders/PointRangeQueryNodeBuilder.java | 29 +-
.../builders/PrefixWildcardQueryNodeBuilder.java | 18 +-
.../standard/builders/RegexpQueryNodeBuilder.java | 13 +-
.../standard/builders/SlopQueryNodeBuilder.java | 19 +-
.../standard/builders/StandardQueryBuilder.java | 7 +-
.../builders/StandardQueryTreeBuilder.java | 24 +-
.../builders/TermRangeQueryNodeBuilder.java | 38 +-
.../builders/WildcardQueryNodeBuilder.java | 18 +-
.../flexible/standard/builders/package-info.java | 23 +-
.../standard/config/FieldBoostMapFCListener.java | 18 +-
.../config/FieldDateResolutionFCListener.java | 20 +-
.../flexible/standard/config/FuzzyConfig.java | 9 +-
.../flexible/standard/config/NumberDateFormat.java | 34 +-
.../flexible/standard/config/PointsConfig.java | 67 +-
.../standard/config/PointsConfigListener.java | 28 +-
.../config/StandardQueryConfigHandler.java | 149 +-
.../flexible/standard/config/package-info.java | 20 +-
.../standard/nodes/AbstractRangeQueryNode.java | 115 +-
.../standard/nodes/BooleanModifierNode.java | 9 +-
.../standard/nodes/MultiPhraseQueryNode.java | 20 +-
.../flexible/standard/nodes/PointQueryNode.java | 78 +-
.../standard/nodes/PointRangeQueryNode.java | 98 +-
.../standard/nodes/PrefixWildcardQueryNode.java | 25 +-
.../flexible/standard/nodes/RegexpQueryNode.java | 32 +-
.../flexible/standard/nodes/SynonymQueryNode.java | 1 -
.../standard/nodes/TermRangeQueryNode.java | 25 +-
.../flexible/standard/nodes/WildcardQueryNode.java | 20 +-
.../flexible/standard/nodes/package-info.java | 13 +-
.../flexible/standard/package-info.java | 31 +-
.../standard/parser/EscapeQuerySyntaxImpl.java | 131 +-
.../flexible/standard/parser/package-info.java | 17 +-
.../processors/AllowLeadingWildcardProcessor.java | 42 +-
.../processors/AnalyzerQueryNodeProcessor.java | 153 +-
.../BooleanQuery2ModifierNodeProcessor.java | 112 +-
...nSingleChildOptimizationQueryNodeProcessor.java | 25 +-
.../processors/BoostQueryNodeProcessor.java | 25 +-
.../DefaultPhraseSlopQueryNodeProcessor.java | 34 +-
.../processors/FuzzyQueryNodeProcessor.java | 28 +-
.../processors/MatchAllDocsQueryNodeProcessor.java | 19 +-
.../processors/MultiFieldQueryNodeProcessor.java | 26 +-
.../MultiTermRewriteMethodProcessor.java | 17 +-
.../processors/OpenRangeQueryNodeProcessor.java | 42 +-
.../processors/PhraseSlopQueryNodeProcessor.java | 17 +-
.../processors/PointQueryNodeProcessor.java | 92 +-
.../processors/PointRangeQueryNodeProcessor.java | 56 +-
.../processors/RegexpQueryNodeProcessor.java | 5 +-
.../RemoveEmptyNonLeafQueryNodeProcessor.java | 28 +-
.../StandardQueryNodeProcessorPipeline.java | 25 +-
.../processors/TermRangeQueryNodeProcessor.java | 85 +-
.../processors/WildcardQueryNodeProcessor.java | 85 +-
.../flexible/standard/processors/package-info.java | 18 +-
.../queryparser/simple/SimpleQueryParser.java | 200 +-
.../lucene/queryparser/simple/package-info.java | 6 +-
.../queryparser/surround/parser/package-info.java | 9 +-
.../queryparser/surround/query/AndQuery.java | 18 +-
.../surround/query/BasicQueryFactory.java | 46 +-
.../queryparser/surround/query/ComposedQuery.java | 68 +-
.../queryparser/surround/query/DistanceQuery.java | 59 +-
.../surround/query/DistanceRewriteQuery.java | 7 +-
.../surround/query/DistanceSubQuery.java | 18 +-
.../queryparser/surround/query/FieldsQuery.java | 51 +-
.../queryparser/surround/query/NotQuery.java | 30 +-
.../lucene/queryparser/surround/query/OrQuery.java | 27 +-
.../queryparser/surround/query/RewriteQuery.java | 37 +-
.../queryparser/surround/query/SimpleTerm.java | 87 +-
.../surround/query/SimpleTermRewriteQuery.java | 35 +-
.../surround/query/SpanNearClauseFactory.java | 97 +-
.../surround/query/SrndBooleanQuery.java | 18 +-
.../surround/query/SrndPrefixQuery.java | 51 +-
.../queryparser/surround/query/SrndQuery.java | 75 +-
.../queryparser/surround/query/SrndTermQuery.java | 34 +-
.../queryparser/surround/query/SrndTruncQuery.java | 59 +-
.../surround/query/TooManyBasicQueries.java | 12 +-
.../queryparser/surround/query/package-info.java | 21 +-
.../apache/lucene/queryparser/xml/CoreParser.java | 58 +-
.../queryparser/xml/CorePlusExtensionsParser.java | 10 +-
.../queryparser/xml/CorePlusQueriesParser.java | 9 +-
.../apache/lucene/queryparser/xml/DOMUtils.java | 74 +-
.../lucene/queryparser/xml/ParserException.java | 5 +-
.../lucene/queryparser/xml/QueryBuilder.java | 4 +-
.../queryparser/xml/QueryBuilderFactory.java | 8 +-
.../xml/builders/BooleanQueryBuilder.java | 15 +-
.../xml/builders/BoostingTermBuilder.java | 14 +-
.../xml/builders/ConstantScoreQueryBuilder.java | 6 +-
.../xml/builders/DisjunctionMaxQueryBuilder.java | 12 +-
.../xml/builders/FuzzyLikeThisQueryBuilder.java | 8 +-
.../xml/builders/LikeThisQueryBuilder.java | 41 +-
.../xml/builders/MatchAllDocsQueryBuilder.java | 11 +-
.../xml/builders/PointRangeQueryBuilder.java | 22 +-
.../xml/builders/RangeQueryBuilder.java | 8 +-
.../queryparser/xml/builders/SpanBuilderBase.java | 10 +-
.../queryparser/xml/builders/SpanFirstBuilder.java | 10 +-
.../queryparser/xml/builders/SpanNearBuilder.java | 13 +-
.../queryparser/xml/builders/SpanNotBuilder.java | 10 +-
.../queryparser/xml/builders/SpanOrBuilder.java | 13 +-
.../xml/builders/SpanOrTermsBuilder.java | 22 +-
.../xml/builders/SpanPositionRangeBuilder.java | 5 +-
.../queryparser/xml/builders/SpanQueryBuilder.java | 7 +-
.../xml/builders/SpanQueryBuilderFactory.java | 11 +-
.../queryparser/xml/builders/SpanTermBuilder.java | 10 +-
.../queryparser/xml/builders/TermQueryBuilder.java | 12 +-
.../xml/builders/TermsQueryBuilder.java | 13 +-
.../xml/builders/UserInputQueryBuilder.java | 20 +-
.../queryparser/xml/builders/package-info.java | 7 +-
.../lucene/queryparser/xml/package-info.java | 7 +-
.../queryparser/classic/TestMultiAnalyzer.java | 138 +-
.../classic/TestMultiFieldQueryParser.java | 188 +-
.../classic/TestMultiPhraseQueryParsing.java | 41 +-
.../queryparser/classic/TestQueryParser.java | 535 ++--
.../complexPhrase/TestComplexPhraseQuery.java | 84 +-
.../lucene/queryparser/ext/ExtensionStub.java | 4 +-
.../queryparser/ext/TestExtendableQueryParser.java | 64 +-
.../lucene/queryparser/ext/TestExtensions.java | 21 +-
.../core/builders/TestQueryTreeBuilder.java | 24 +-
.../flexible/core/nodes/TestQueryNode.java | 17 +-
.../queryparser/flexible/messages/TestNLS.java | 68 +-
.../precedence/TestPrecedenceQueryParser.java | 180 +-
.../flexible/spans/SpanOrQueryNodeBuilder.java | 7 +-
.../flexible/spans/SpanTermQueryNodeBuilder.java | 11 +-
.../flexible/spans/SpansQueryConfigHandler.java | 9 +-
.../flexible/spans/SpansQueryTreeBuilder.java | 10 +-
.../spans/SpansValidatorQueryNodeProcessor.java | 29 +-
.../flexible/spans/TestSpanQueryParser.java | 152 +-
.../spans/TestSpanQueryParserSimpleSample.java | 67 +-
.../flexible/spans/UniqueFieldAttribute.java | 7 +-
.../flexible/spans/UniqueFieldAttributeImpl.java | 17 +-
.../spans/UniqueFieldQueryNodeProcessor.java | 20 +-
.../standard/TestMultiAnalyzerQPHelper.java | 96 +-
.../flexible/standard/TestMultiFieldQPHelper.java | 168 +-
.../flexible/standard/TestPointQueryParser.java | 71 +-
.../flexible/standard/TestQPHelper.java | 458 ++--
.../flexible/standard/TestStandardQP.java | 109 +-
.../queryparser/simple/TestSimpleQueryParser.java | 70 +-
.../surround/query/BooleanQueryTst.java | 27 +-
.../surround/query/ExceptionQueryTst.java | 17 +-
.../surround/query/SingleFieldTestDb.java | 27 +-
.../queryparser/surround/query/SrndQueryTest.java | 11 +-
.../surround/query/Test01Exceptions.java | 4 -
.../queryparser/surround/query/Test02Boolean.java | 101 +-
.../queryparser/surround/query/Test03Distance.java | 203 +-
.../queryparser/util/QueryParserTestBase.java | 759 +++---
.../queryparser/xml/CoreParserTestIndexData.java | 20 +-
.../lucene/queryparser/xml/TestCoreParser.java | 75 +-
.../xml/TestCorePlusExtensionsParser.java | 3 +-
.../queryparser/xml/TestCorePlusQueriesParser.java | 1 -
.../IndexAndTaxonomyReplicationHandler.java | 104 +-
.../replicator/IndexAndTaxonomyRevision.java | 120 +-
.../lucene/replicator/IndexInputInputStream.java | 26 +-
.../lucene/replicator/IndexReplicationHandler.java | 166 +-
.../apache/lucene/replicator/IndexRevision.java | 69 +-
.../apache/lucene/replicator/LocalReplicator.java | 117 +-
.../replicator/PerSessionDirectoryFactory.java | 17 +-
.../lucene/replicator/ReplicationClient.java | 213 +-
.../org/apache/lucene/replicator/Replicator.java | 75 +-
.../org/apache/lucene/replicator/Revision.java | 55 +-
.../org/apache/lucene/replicator/RevisionFile.java | 20 +-
.../lucene/replicator/SessionExpiredException.java | 25 +-
.../org/apache/lucene/replicator/SessionToken.java | 40 +-
.../lucene/replicator/http/HttpClientBase.java | 140 +-
.../lucene/replicator/http/HttpReplicator.java | 97 +-
.../lucene/replicator/http/ReplicationService.java | 96 +-
.../lucene/replicator/http/package-info.java | 8 +-
.../org/apache/lucene/replicator/nrt/CopyJob.java | 99 +-
.../apache/lucene/replicator/nrt/CopyOneFile.java | 53 +-
.../apache/lucene/replicator/nrt/CopyState.java | 21 +-
.../apache/lucene/replicator/nrt/FileMetaData.java | 12 +-
.../org/apache/lucene/replicator/nrt/Node.java | 130 +-
.../replicator/nrt/NodeCommunicationException.java | 4 +-
.../replicator/nrt/PreCopyMergedSegmentWarmer.java | 25 +-
.../apache/lucene/replicator/nrt/PrimaryNode.java | 133 +-
.../lucene/replicator/nrt/ReplicaFileDeleter.java | 39 +-
.../apache/lucene/replicator/nrt/ReplicaNode.java | 477 ++--
.../nrt/SegmentInfosSearcherManager.java | 45 +-
.../apache/lucene/replicator/nrt/package-info.java | 6 +-
.../org/apache/lucene/replicator/package-info.java | 61 +-
.../lucene/replicator/ReplicatorTestCase.java | 73 +-
.../TestIndexAndTaxonomyReplicationClient.java | 354 +--
.../replicator/TestIndexAndTaxonomyRevision.java | 38 +-
.../replicator/TestIndexReplicationClient.java | 270 +-
.../lucene/replicator/TestIndexRevision.java | 30 +-
.../lucene/replicator/TestLocalReplicator.java | 100 +-
.../apache/lucene/replicator/TestSessionToken.java | 6 +-
.../lucene/replicator/http/ReplicationServlet.java | 11 +-
.../lucene/replicator/http/TestHttpReplicator.java | 62 +-
.../org/apache/lucene/replicator/nrt/Jobs.java | 18 +-
.../apache/lucene/replicator/nrt/NodeProcess.java | 31 +-
.../lucene/replicator/nrt/SimpleCopyJob.java | 108 +-
.../lucene/replicator/nrt/SimplePrimaryNode.java | 437 ++--
.../lucene/replicator/nrt/SimpleReplicaNode.java | 357 +--
.../apache/lucene/replicator/nrt/SimpleServer.java | 159 +-
.../lucene/replicator/nrt/SimpleTransLog.java | 93 +-
.../lucene/replicator/nrt/TestNRTReplication.java | 189 +-
.../replicator/nrt/TestStressNRTReplication.java | 512 ++--
.../apache/lucene/replicator/nrt/ThreadPumper.java | 62 +-
.../lucene/payloads/PayloadSpanCollector.java | 18 +-
.../apache/lucene/payloads/PayloadSpanUtil.java | 39 +-
.../org/apache/lucene/payloads/package-info.java | 4 +-
.../codecs/idversion/IDVersionPostingsFormat.java | 90 +-
.../codecs/idversion/IDVersionPostingsReader.java | 34 +-
.../codecs/idversion/IDVersionPostingsWriter.java | 55 +-
.../idversion/IDVersionSegmentTermsEnum.java | 547 ++--
.../idversion/IDVersionSegmentTermsEnumFrame.java | 159 +-
.../sandbox/codecs/idversion/SingleDocsEnum.java | 3 +-
.../codecs/idversion/SinglePostingsEnum.java | 2 +-
.../idversion/VersionBlockTreeTermsReader.java | 126 +-
.../idversion/VersionBlockTreeTermsWriter.java | 340 ++-
.../codecs/idversion/VersionFieldReader.java | 64 +-
.../sandbox/codecs/idversion/package-info.java | 10 +-
.../lucene/sandbox/document/BigIntegerPoint.java | 157 +-
.../document/DoublePointMultiRangeBuilder.java | 11 +-
.../document/FloatPointMultiRangeBuilder.java | 14 +-
.../document/FloatPointNearestNeighbor.java | 136 +-
.../lucene/sandbox/document/HalfFloatPoint.java | 196 +-
.../document/IntPointMultiRangeBuilder.java | 10 +-
.../lucene/sandbox/document/LatLonBoundingBox.java | 145 +-
.../document/LongPointMultiRangeBuilder.java | 10 +-
.../lucene/sandbox/document/package-info.java | 9 +-
.../lucene/sandbox/queries/FuzzyLikeThisQuery.java | 277 +--
.../lucene/sandbox/queries/package-info.java | 6 +-
.../apache/lucene/sandbox/search/BM25FQuery.java | 105 +-
.../lucene/sandbox/search/CoveringQuery.java | 61 +-
.../lucene/sandbox/search/CoveringScorer.java | 186 +-
.../sandbox/search/DocValuesNumbersQuery.java | 79 +-
.../lucene/sandbox/search/DocValuesTermsQuery.java | 163 +-
.../IndexSortSortedNumericDocValuesRangeQuery.java | 88 +-
.../search/LargeNumHitsTopDocsCollector.java | 35 +-
.../search/LatLonPointPrototypeQueries.java | 54 +-
.../apache/lucene/sandbox/search/LongHashSet.java | 9 +-
.../sandbox/search/MultiNormsLeafSimScorer.java | 46 +-
.../lucene/sandbox/search/MultiRangeQuery.java | 166 +-
.../lucene/sandbox/search/NearestNeighbor.java | 212 +-
.../lucene/sandbox/search/PhraseWildcardQuery.java | 402 +--
.../lucene/sandbox/search/TermAutomatonQuery.java | 161 +-
.../lucene/sandbox/search/TermAutomatonScorer.java | 86 +-
.../search/TokenStreamToTermAutomatonQuery.java | 29 +-
.../apache/lucene/sandbox/search/package-info.java | 7 +-
.../lucene/payloads/TestPayloadSpanUtil.java | 19 +-
.../codecs/idversion/StringAndPayloadField.java | 4 +-
.../idversion/TestIDVersionPostingsFormat.java | 663 +++--
.../sandbox/document/TestBigIntegerPoint.java | 86 +-
.../sandbox/document/TestDoubleRangeField.java | 38 +-
.../document/TestFloatPointNearestNeighbor.java | 98 +-
.../sandbox/document/TestHalfFloatPoint.java | 43 +-
.../sandbox/queries/TestFuzzyLikeThisQuery.java | 22 +-
.../lucene/sandbox/search/LongHashSetTests.java | 11 +-
.../lucene/sandbox/search/TestBM25FQuery.java | 66 +-
.../lucene/sandbox/search/TestCoveringQuery.java | 29 +-
.../sandbox/search/TestDocValuesNumbersQuery.java | 39 +-
.../sandbox/search/TestDocValuesTermsQuery.java | 29 +-
.../sandbox/search/TestFieldCacheTermsFilter.java | 28 +-
...tIndexSortSortedNumericDocValuesRangeQuery.java | 51 +-
.../search/TestLargeNumHitsTopDocsCollector.java | 36 +-
.../search/TestLatLonBoundingBoxQueries.java | 90 +-
.../sandbox/search/TestMultiRangeQueries.java | 66 +-
.../apache/lucene/sandbox/search/TestNearest.java | 120 +-
.../sandbox/search/TestPhraseWildcardQuery.java | 378 +--
.../sandbox/search/TestTermAutomatonQuery.java | 209 +-
.../org/apache/lucene/spatial/ShapeValues.java | 11 +-
.../apache/lucene/spatial/ShapeValuesSource.java | 10 +-
.../org/apache/lucene/spatial/SpatialStrategy.java | 115 +-
.../spatial/bbox/BBoxOverlapRatioValueSource.java | 169 +-
.../spatial/bbox/BBoxSimilarityValueSource.java | 62 +-
.../apache/lucene/spatial/bbox/BBoxStrategy.java | 227 +-
.../lucene/spatial/bbox/BBoxValueSource.java | 15 +-
.../apache/lucene/spatial/bbox/package-info.java | 6 +-
.../composite/CompositeSpatialStrategy.java | 64 +-
.../spatial/composite/CompositeVerifyQuery.java | 32 +-
.../composite/IntersectsRPTVerifyQuery.java | 103 +-
.../lucene/spatial/composite/package-info.java | 2 +-
.../org/apache/lucene/spatial/package-info.java | 2 +-
.../spatial/prefix/AbstractPrefixTreeQuery.java | 33 +-
.../prefix/AbstractVisitingPrefixTreeQuery.java | 242 +-
.../prefix/BytesRefIteratorTokenStream.java | 6 +-
.../spatial/prefix/CellToBytesRefIterator.java | 6 +-
.../spatial/prefix/ContainsPrefixTreeQuery.java | 148 +-
.../lucene/spatial/prefix/HeatmapFacetCounter.java | 251 +-
.../spatial/prefix/IntersectsPrefixTreeQuery.java | 29 +-
.../prefix/NumberRangePrefixTreeStrategy.java | 121 +-
.../prefix/PointPrefixTreeFieldCacheProvider.java | 16 +-
.../spatial/prefix/PrefixTreeFacetCounter.java | 128 +-
.../lucene/spatial/prefix/PrefixTreeStrategy.java | 151 +-
.../prefix/RecursivePrefixTreeStrategy.java | 107 +-
.../prefix/TermQueryPrefixTreeStrategy.java | 52 +-
.../spatial/prefix/WithinPrefixTreeQuery.java | 147 +-
.../apache/lucene/spatial/prefix/package-info.java | 4 +-
.../apache/lucene/spatial/prefix/tree/Cell.java | 91 +-
.../lucene/spatial/prefix/tree/CellCanPrune.java | 9 +-
.../lucene/spatial/prefix/tree/CellIterator.java | 26 +-
.../spatial/prefix/tree/DateRangePrefixTree.java | 361 +--
.../spatial/prefix/tree/FilterCellIterator.java | 15 +-
.../spatial/prefix/tree/GeohashPrefixTree.java | 58 +-
.../lucene/spatial/prefix/tree/LegacyCell.java | 97 +-
.../spatial/prefix/tree/LegacyPrefixTree.java | 39 +-
.../spatial/prefix/tree/NumberRangePrefixTree.java | 526 ++--
.../spatial/prefix/tree/PackedQuadPrefixTree.java | 207 +-
.../lucene/spatial/prefix/tree/QuadPrefixTree.java | 117 +-
.../lucene/spatial/prefix/tree/S2PrefixTree.java | 221 +-
.../spatial/prefix/tree/S2PrefixTreeCell.java | 442 ++--
.../lucene/spatial/prefix/tree/S2ShapeFactory.java | 7 +-
.../spatial/prefix/tree/SingletonCellIterator.java | 3 +-
.../spatial/prefix/tree/SpatialPrefixTree.java | 61 +-
.../prefix/tree/SpatialPrefixTreeFactory.java | 48 +-
.../spatial/prefix/tree/TreeCellIterator.java | 53 +-
.../lucene/spatial/prefix/tree/package-info.java | 19 +-
.../apache/lucene/spatial/query/SpatialArgs.java | 40 +-
.../lucene/spatial/query/SpatialArgsParser.java | 50 +-
.../lucene/spatial/query/SpatialOperation.java | 194 +-
.../spatial/query/UnsupportedSpatialOperation.java | 4 +-
.../apache/lucene/spatial/query/package-info.java | 4 +-
.../spatial/serialized/SerializedDVStrategy.java | 94 +-
.../lucene/spatial/serialized/package-info.java | 6 +-
.../lucene/spatial/spatial4j/Geo3dBinaryCodec.java | 28 +-
.../lucene/spatial/spatial4j/Geo3dCircleShape.java | 24 +-
.../spatial/spatial4j/Geo3dDistanceCalculator.java | 28 +-
.../lucene/spatial/spatial4j/Geo3dPointShape.java | 10 +-
.../spatial/spatial4j/Geo3dRectangleShape.java | 63 +-
.../lucene/spatial/spatial4j/Geo3dShape.java | 36 +-
.../spatial/spatial4j/Geo3dShapeFactory.java | 133 +-
.../spatial4j/Geo3dSpatialContextFactory.java | 13 +-
.../lucene/spatial/spatial4j/package-info.java | 2 +-
.../spatial/util/CachingDoubleValueSource.java | 14 +-
.../spatial/util/DistanceToShapeValueSource.java | 42 +-
.../spatial/util/ReciprocalDoubleValuesSource.java | 22 +-
.../lucene/spatial/util/ShapeAreaValueSource.java | 36 +-
.../lucene/spatial/util/ShapeFieldCache.java | 26 +-
.../util/ShapeFieldCacheDistanceValueSource.java | 64 +-
.../spatial/util/ShapeFieldCacheProvider.java | 25 +-
.../lucene/spatial/util/ShapeValuesPredicate.java | 25 +-
.../apache/lucene/spatial/util/package-info.java | 2 +-
.../lucene/spatial/vector/DistanceValueSource.java | 55 +-
.../lucene/spatial/vector/PointVectorStrategy.java | 156 +-
.../apache/lucene/spatial/vector/package-info.java | 4 +-
.../org/apache/lucene/spatial/SpatialExample.java | 110 +-
.../apache/lucene/spatial/SpatialMatchConcern.java | 11 +-
.../org/apache/lucene/spatial/SpatialTestCase.java | 53 +-
.../org/apache/lucene/spatial/SpatialTestData.java | 21 +-
.../apache/lucene/spatial/SpatialTestQuery.java | 37 +-
.../apache/lucene/spatial/StrategyTestCase.java | 74 +-
.../lucene/spatial/TestDistanceStrategy.java | 39 +-
.../org/apache/lucene/spatial/TestPortedSolr3.java | 69 +-
.../lucene/spatial/TestQueryEqualsHashCode.java | 60 +-
.../org/apache/lucene/spatial/TestSpatialArgs.java | 9 +-
.../apache/lucene/spatial/TestTestFramework.java | 40 +-
.../lucene/spatial/bbox/TestBBoxStrategy.java | 172 +-
.../spatial/composite/TestCompositeStrategy.java | 51 +-
.../prefix/RandomSpatialOpStrategyTestCase.java | 65 +-
.../lucene/spatial/prefix/TestDateNRStrategy.java | 44 +-
.../spatial/prefix/TestHeatmapFacetCounter.java | 137 +-
.../lucene/spatial/prefix/TestJtsPolygon.java | 53 +-
.../spatial/prefix/TestNumberRangeFacets.java | 82 +-
.../prefix/TestRandomSpatialOpFuzzyPrefixTree.java | 311 +--
.../TestRandomSpatialOpFuzzyPrefixTree50.java | 5 +-
.../prefix/TestRecursivePrefixTreeStrategy.java | 50 +-
.../prefix/TestTermQueryPrefixGridStrategy.java | 30 +-
.../prefix/tree/TestDateRangePrefixTree.java | 240 +-
.../spatial/prefix/tree/TestS2PrefixTree.java | 34 +-
.../spatial/prefix/tree/TestSpatialPrefixTree.java | 32 +-
.../spatial/query/TestSpatialArgsParser.java | 28 +-
.../spatial/serialized/TestSerializedStrategy.java | 3 +-
.../spatial/spatial4j/RandomizedShapeTestCase.java | 19 +-
.../spatial4j/ShapeRectRelationTestCase.java | 42 +-
.../apache/lucene/spatial/spatial4j/TestGeo3d.java | 49 +-
.../lucene/spatial/spatial4j/TestGeo3dRpt.java | 51 +-
.../TestGeo3dShapeSphereModelRectRelation.java | 44 +-
.../TestGeo3dShapeWGS84ModelRectRelation.java | 120 +-
.../spatial/vector/TestPointVectorStrategy.java | 31 +-
.../lucene/spatial3d/Geo3DDocValuesField.java | 313 ++-
.../org/apache/lucene/spatial3d/Geo3DPoint.java | 151 +-
.../spatial3d/Geo3DPointDistanceComparator.java | 72 +-
.../Geo3DPointOutsideDistanceComparator.java | 55 +-
.../spatial3d/Geo3DPointOutsideSortField.java | 17 +-
.../lucene/spatial3d/Geo3DPointSortField.java | 15 +-
.../org/apache/lucene/spatial3d/Geo3DUtil.java | 156 +-
.../lucene/spatial3d/PointInGeo3DShapeQuery.java | 35 +-
.../spatial3d/PointInShapeIntersectVisitor.java | 108 +-
.../apache/lucene/spatial3d/geom/ArcDistance.java | 53 +-
.../lucene/spatial3d/geom/BasePlanetObject.java | 30 +-
.../apache/lucene/spatial3d/geom/BaseXYZSolid.java | 81 +-
.../org/apache/lucene/spatial3d/geom/Bounded.java | 7 +-
.../org/apache/lucene/spatial3d/geom/Bounds.java | 181 +-
.../lucene/spatial3d/geom/DistanceStyle.java | 110 +-
.../org/apache/lucene/spatial3d/geom/GeoArea.java | 36 +-
.../lucene/spatial3d/geom/GeoAreaFactory.java | 28 +-
.../apache/lucene/spatial3d/geom/GeoAreaShape.java | 16 +-
.../org/apache/lucene/spatial3d/geom/GeoBBox.java | 6 +-
.../lucene/spatial3d/geom/GeoBBoxFactory.java | 85 +-
.../lucene/spatial3d/geom/GeoBaseAreaShape.java | 62 +-
.../apache/lucene/spatial3d/geom/GeoBaseBBox.java | 12 +-
.../lucene/spatial3d/geom/GeoBaseCircle.java | 8 +-
.../spatial3d/geom/GeoBaseCompositeAreaShape.java | 74 +-
.../geom/GeoBaseCompositeMembershipShape.java | 21 +-
.../spatial3d/geom/GeoBaseCompositeShape.java | 37 +-
.../spatial3d/geom/GeoBaseDistanceShape.java | 38 +-
.../spatial3d/geom/GeoBaseMembershipShape.java | 22 +-
.../apache/lucene/spatial3d/geom/GeoBasePath.java | 8 +-
.../lucene/spatial3d/geom/GeoBasePolygon.java | 8 +-
.../apache/lucene/spatial3d/geom/GeoBaseShape.java | 15 +-
.../apache/lucene/spatial3d/geom/GeoCircle.java | 3 +-
.../lucene/spatial3d/geom/GeoCircleFactory.java | 47 +-
.../lucene/spatial3d/geom/GeoComplexPolygon.java | 1857 +++++++++-----
.../spatial3d/geom/GeoCompositeAreaShape.java | 14 +-
.../geom/GeoCompositeMembershipShape.java | 17 +-
.../lucene/spatial3d/geom/GeoCompositePolygon.java | 20 +-
.../lucene/spatial3d/geom/GeoConcavePolygon.java | 311 ++-
.../lucene/spatial3d/geom/GeoConvexPolygon.java | 316 +--
.../geom/GeoDegenerateHorizontalLine.java | 118 +-
.../spatial3d/geom/GeoDegenerateLatitudeZone.java | 46 +-
.../geom/GeoDegenerateLongitudeSlice.java | 68 +-
.../lucene/spatial3d/geom/GeoDegeneratePath.java | 796 +++---
.../lucene/spatial3d/geom/GeoDegeneratePoint.java | 87 +-
.../spatial3d/geom/GeoDegenerateVerticalLine.java | 125 +-
.../apache/lucene/spatial3d/geom/GeoDistance.java | 56 +-
.../lucene/spatial3d/geom/GeoDistanceShape.java | 21 +-
.../lucene/spatial3d/geom/GeoExactCircle.java | 314 ++-
.../lucene/spatial3d/geom/GeoLatitudeZone.java | 99 +-
.../lucene/spatial3d/geom/GeoLongitudeSlice.java | 109 +-
.../lucene/spatial3d/geom/GeoMembershipShape.java | 7 +-
.../spatial3d/geom/GeoNorthLatitudeZone.java | 61 +-
.../lucene/spatial3d/geom/GeoNorthRectangle.java | 196 +-
.../lucene/spatial3d/geom/GeoOutsideDistance.java | 23 +-
.../org/apache/lucene/spatial3d/geom/GeoPath.java | 37 +-
.../lucene/spatial3d/geom/GeoPathFactory.java | 12 +-
.../org/apache/lucene/spatial3d/geom/GeoPoint.java | 230 +-
.../lucene/spatial3d/geom/GeoPointShape.java | 7 +-
.../spatial3d/geom/GeoPointShapeFactory.java | 11 +-
.../apache/lucene/spatial3d/geom/GeoPolygon.java | 4 +-
.../lucene/spatial3d/geom/GeoPolygonFactory.java | 1435 ++++++-----
.../apache/lucene/spatial3d/geom/GeoRectangle.java | 227 +-
.../apache/lucene/spatial3d/geom/GeoS2Shape.java | 366 +--
.../lucene/spatial3d/geom/GeoS2ShapeFactory.java | 20 +-
.../org/apache/lucene/spatial3d/geom/GeoShape.java | 39 +-
.../apache/lucene/spatial3d/geom/GeoSizeable.java | 4 +-
.../spatial3d/geom/GeoSouthLatitudeZone.java | 51 +-
.../lucene/spatial3d/geom/GeoSouthRectangle.java | 159 +-
.../lucene/spatial3d/geom/GeoStandardCircle.java | 93 +-
.../lucene/spatial3d/geom/GeoStandardPath.java | 1397 +++++++----
.../geom/GeoWideDegenerateHorizontalLine.java | 142 +-
.../spatial3d/geom/GeoWideLongitudeSlice.java | 132 +-
.../spatial3d/geom/GeoWideNorthRectangle.java | 178 +-
.../lucene/spatial3d/geom/GeoWideRectangle.java | 221 +-
.../spatial3d/geom/GeoWideSouthRectangle.java | 156 +-
.../org/apache/lucene/spatial3d/geom/GeoWorld.java | 33 +-
.../apache/lucene/spatial3d/geom/LatLonBounds.java | 181 +-
.../lucene/spatial3d/geom/LinearDistance.java | 53 +-
.../spatial3d/geom/LinearSquaredDistance.java | 53 +-
.../apache/lucene/spatial3d/geom/Membership.java | 1 -
.../lucene/spatial3d/geom/NormalDistance.java | 53 +-
.../spatial3d/geom/NormalSquaredDistance.java | 53 +-
.../org/apache/lucene/spatial3d/geom/Plane.java | 1681 ++++++++-----
.../apache/lucene/spatial3d/geom/PlanetModel.java | 410 ++-
.../apache/lucene/spatial3d/geom/PlanetObject.java | 1 -
.../lucene/spatial3d/geom/SerializableObject.java | 279 ++-
.../apache/lucene/spatial3d/geom/SidedPlane.java | 171 +-
.../lucene/spatial3d/geom/StandardObjects.java | 92 +-
.../lucene/spatial3d/geom/StandardXYZSolid.java | 462 ++--
.../org/apache/lucene/spatial3d/geom/Tools.java | 14 +-
.../org/apache/lucene/spatial3d/geom/Vector.java | 268 +-
.../apache/lucene/spatial3d/geom/XYZBounds.java | 219 +-
.../org/apache/lucene/spatial3d/geom/XYZSolid.java | 4 +-
.../lucene/spatial3d/geom/XYZSolidFactory.java | 42 +-
.../apache/lucene/spatial3d/geom/XYdZSolid.java | 183 +-
.../apache/lucene/spatial3d/geom/XdYZSolid.java | 176 +-
.../apache/lucene/spatial3d/geom/XdYdZSolid.java | 86 +-
.../apache/lucene/spatial3d/geom/dXYZSolid.java | 191 +-
.../apache/lucene/spatial3d/geom/dXYdZSolid.java | 86 +-
.../apache/lucene/spatial3d/geom/dXdYZSolid.java | 86 +-
.../apache/lucene/spatial3d/geom/dXdYdZSolid.java | 90 +-
.../apache/lucene/spatial3d/geom/package-info.java | 2 +-
.../org/apache/lucene/spatial3d/package-info.java | 3 +-
.../lucene/spatial3d/TestGeo3DDocValues.java | 17 +-
.../apache/lucene/spatial3d/TestGeo3DPoint.java | 1414 +++++++----
.../apache/lucene/spatial3d/geom/Geo3DUtil.java | 6 +-
.../spatial3d/geom/RandomGeo3dShapeGenerator.java | 559 +++--
.../geom/TestCompositeGeoPolygonRelationships.java | 971 ++++----
.../apache/lucene/spatial3d/geom/TestGeoBBox.java | 249 +-
.../lucene/spatial3d/geom/TestGeoCircle.java | 310 ++-
.../spatial3d/geom/TestGeoConvexPolygon.java | 12 +-
.../lucene/spatial3d/geom/TestGeoExactCircle.java | 181 +-
.../apache/lucene/spatial3d/geom/TestGeoModel.java | 21 +-
.../apache/lucene/spatial3d/geom/TestGeoPath.java | 260 +-
.../apache/lucene/spatial3d/geom/TestGeoPoint.java | 59 +-
.../lucene/spatial3d/geom/TestGeoPolygon.java | 2607 +++++++++++++-------
.../apache/lucene/spatial3d/geom/TestPlane.java | 29 +-
.../spatial3d/geom/TestRandomBinaryCodec.java | 13 +-
.../spatial3d/geom/TestRandomGeoPolygon.java | 172 +-
.../geom/TestRandomGeoShapeRelationship.java | 120 +-
.../lucene/spatial3d/geom/TestRandomPlane.java | 58 +-
.../geom/TestSimpleGeoPolygonRelationships.java | 1203 +++++----
.../apache/lucene/spatial3d/geom/TestXYZSolid.java | 32 +-
.../lucene/search/spell/CombineSuggestion.java | 23 +-
.../org/apache/lucene/search/spell/Dictionary.java | 9 +-
.../lucene/search/spell/DirectSpellChecker.java | 352 ++-
.../search/spell/HighFrequencyDictionary.java | 33 +-
.../lucene/search/spell/JaroWinklerDistance.java | 39 +-
.../lucene/search/spell/LevenshteinDistance.java | 161 +-
.../lucene/search/spell/LuceneDictionary.java | 14 +-
.../search/spell/LuceneLevenshteinDistance.java | 71 +-
.../apache/lucene/search/spell/NGramDistance.java | 132 +-
.../lucene/search/spell/PlainTextDictionary.java | 17 +-
.../apache/lucene/search/spell/SpellChecker.java | 292 ++-
.../apache/lucene/search/spell/StringDistance.java | 14 +-
.../apache/lucene/search/spell/SuggestMode.java | 15 +-
.../apache/lucene/search/spell/SuggestWord.java | 30 +-
.../spell/SuggestWordFrequencyComparator.java | 12 +-
.../lucene/search/spell/SuggestWordQueue.java | 16 +-
.../search/spell/SuggestWordScoreComparator.java | 13 +-
.../lucene/search/spell/WordBreakSpellChecker.java | 334 ++-
.../apache/lucene/search/spell/package-info.java | 5 +-
.../apache/lucene/search/suggest/BitsProducer.java | 9 +-
.../search/suggest/BufferedInputIterator.java | 8 +-
.../lucene/search/suggest/DocumentDictionary.java | 99 +-
.../suggest/DocumentValueSourceDictionary.java | 108 +-
.../lucene/search/suggest/FileDictionary.java | 75 +-
.../lucene/search/suggest/InMemorySorter.java | 9 +-
.../lucene/search/suggest/InputIterator.java | 45 +-
.../org/apache/lucene/search/suggest/Lookup.java | 156 +-
.../lucene/search/suggest/SortedInputIterator.java | 147 +-
.../search/suggest/UnsortedInputIterator.java | 19 +-
.../suggest/analyzing/AnalyzingInfixSuggester.java | 542 ++--
.../suggest/analyzing/AnalyzingSuggester.java | 481 ++--
.../suggest/analyzing/BlendedInfixSuggester.java | 168 +-
.../lucene/search/suggest/analyzing/FSTUtil.java | 64 +-
.../suggest/analyzing/FreeTextSuggester.java | 459 ++--
.../search/suggest/analyzing/FuzzySuggester.java | 220 +-
.../suggest/analyzing/SuggestStopFilter.java | 23 +-
.../analyzing/SuggestStopFilterFactory.java | 58 +-
.../search/suggest/analyzing/package-info.java | 6 +-
.../document/Completion50PostingsFormat.java | 19 +-
.../document/Completion84PostingsFormat.java | 14 +-
.../suggest/document/CompletionAnalyzer.java | 92 +-
.../suggest/document/CompletionFieldsConsumer.java | 73 +-
.../suggest/document/CompletionFieldsProducer.java | 66 +-
.../suggest/document/CompletionPostingsFormat.java | 130 +-
.../search/suggest/document/CompletionQuery.java | 57 +-
.../search/suggest/document/CompletionScorer.java | 40 +-
.../search/suggest/document/CompletionTerms.java | 26 +-
.../suggest/document/CompletionTokenStream.java | 40 +-
.../search/suggest/document/CompletionWeight.java | 35 +-
.../suggest/document/CompletionsTermsReader.java | 21 +-
.../search/suggest/document/ContextQuery.java | 149 +-
.../suggest/document/ContextSuggestField.java | 65 +-
.../suggest/document/FuzzyCompletionQuery.java | 138 +-
.../search/suggest/document/NRTSuggester.java | 312 +--
.../suggest/document/NRTSuggesterBuilder.java | 56 +-
.../suggest/document/PrefixCompletionQuery.java | 30 +-
.../suggest/document/RegexCompletionQuery.java | 53 +-
.../search/suggest/document/SuggestField.java | 58 +-
.../suggest/document/SuggestIndexSearcher.java | 33 +-
.../document/SuggestScoreDocPriorityQueue.java | 13 +-
.../search/suggest/document/TopSuggestDocs.java | 53 +-
.../suggest/document/TopSuggestDocsCollector.java | 87 +-
.../search/suggest/document/package-info.java | 4 +-
.../lucene/search/suggest/fst/BytesRefSorter.java | 26 +-
.../search/suggest/fst/ExternalRefSorter.java | 54 +-
.../lucene/search/suggest/fst/FSTCompletion.java | 178 +-
.../search/suggest/fst/FSTCompletionBuilder.java | 240 +-
.../search/suggest/fst/FSTCompletionLookup.java | 179 +-
.../search/suggest/fst/WFSTCompletionLookup.java | 135 +-
.../lucene/search/suggest/fst/package-info.java | 6 +-
.../search/suggest/jaspell/JaspellLookup.java | 45 +-
.../suggest/jaspell/JaspellTernarySearchTrie.java | 662 +++--
.../search/suggest/jaspell/package-info.java | 8 +-
.../apache/lucene/search/suggest/package-info.java | 4 +-
.../lucene/search/suggest/tst/TSTAutocomplete.java | 65 +-
.../lucene/search/suggest/tst/TSTLookup.java | 120 +-
.../lucene/search/suggest/tst/TernaryTreeNode.java | 25 +-
.../lucene/search/suggest/tst/package-info.java | 6 +-
.../search/spell/TestDirectSpellChecker.java | 149 +-
.../search/spell/TestJaroWinklerDistance.java | 9 +-
.../search/spell/TestLevenshteinDistance.java | 23 +-
.../lucene/search/spell/TestLuceneDictionary.java | 56 +-
.../lucene/search/spell/TestNGramDistance.java | 76 +-
.../search/spell/TestPlainTextDictionary.java | 7 +-
.../lucene/search/spell/TestSpellChecker.java | 283 ++-
.../search/spell/TestWordBreakSpellChecker.java | 313 ++-
.../org/apache/lucene/search/suggest/Average.java | 70 +-
.../search/suggest/DocumentDictionaryTest.java | 148 +-
.../suggest/DocumentValueSourceDictionaryTest.java | 136 +-
.../lucene/search/suggest/FileDictionaryTest.java | 74 +-
.../org/apache/lucene/search/suggest/Input.java | 28 +-
.../lucene/search/suggest/InputArrayIterator.java | 10 +-
.../lucene/search/suggest/LookupBenchmarkTest.java | 183 +-
.../lucene/search/suggest/PersistenceTest.java | 48 +-
.../lucene/search/suggest/TestInputIterator.java | 71 +-
.../analyzing/AnalyzingInfixSuggesterTest.java | 715 ++++--
.../suggest/analyzing/AnalyzingSuggesterTest.java | 601 +++--
.../analyzing/BlendedInfixSuggesterTest.java | 298 ++-
.../suggest/analyzing/FuzzySuggesterTest.java | 626 +++--
.../suggest/analyzing/TestFreeTextSuggester.java | 370 ++-
.../suggest/analyzing/TestSuggestStopFilter.java | 137 +-
.../analyzing/TestSuggestStopFilterFactory.java | 62 +-
.../search/suggest/document/TestContextQuery.java | 191 +-
.../suggest/document/TestContextSuggestField.java | 127 +-
.../suggest/document/TestFuzzyCompletionQuery.java | 41 +-
.../document/TestPrefixCompletionQuery.java | 196 +-
.../suggest/document/TestRegexCompletionQuery.java | 50 +-
.../search/suggest/document/TestSuggestField.java | 300 ++-
.../search/suggest/fst/BytesRefSortersTest.java | 15 +-
.../search/suggest/fst/FSTCompletionTest.java | 157 +-
.../search/suggest/fst/WFSTCompletionTest.java | 109 +-
.../analysis/BaseTokenStreamFactoryTestCase.java | 120 +-
.../lucene/analysis/BaseTokenStreamTestCase.java | 826 +++++--
.../lucene/analysis/CannedBinaryTokenStream.java | 16 +-
.../apache/lucene/analysis/CannedTokenStream.java | 14 +-
.../apache/lucene/analysis/CollationTestBase.java | 108 +-
.../apache/lucene/analysis/CrankyTokenFilter.java | 14 +-
.../lucene/analysis/LookaheadTokenFilter.java | 117 +-
.../org/apache/lucene/analysis/MockAnalyzer.java | 102 +-
.../apache/lucene/analysis/MockBytesAnalyzer.java | 14 +-
.../org/apache/lucene/analysis/MockCharFilter.java | 46 +-
.../analysis/MockFixedLengthPayloadFilter.java | 5 +-
.../lucene/analysis/MockGraphTokenFilter.java | 29 +-
.../analysis/MockHoleInjectingTokenFilter.java | 10 +-
.../lucene/analysis/MockLowerCaseFilter.java | 6 +-
.../lucene/analysis/MockPayloadAnalyzer.java | 22 +-
.../analysis/MockRandomLookaheadTokenFilter.java | 11 +-
.../apache/lucene/analysis/MockReaderWrapper.java | 9 +-
.../lucene/analysis/MockSynonymAnalyzer.java | 1 -
.../apache/lucene/analysis/MockSynonymFilter.java | 5 +-
.../apache/lucene/analysis/MockTokenFilter.java | 74 +-
.../org/apache/lucene/analysis/MockTokenizer.java | 166 +-
.../analysis/MockUTF16TermAttributeImpl.java | 12 +-
.../analysis/MockVariableLengthPayloadFilter.java | 5 +-
.../lucene/analysis/SimplePayloadFilter.java | 1 -
.../src/java/org/apache/lucene/analysis/Token.java | 112 +-
.../apache/lucene/analysis/TokenStreamToDot.java | 27 +-
.../lucene/analysis/ValidatingTokenFilter.java | 72 +-
.../apache/lucene/analysis/VocabularyAssert.java | 34 +-
.../apache/lucene/codecs/MissingOrdRemapper.java | 21 +-
.../lucene/codecs/asserting/AssertingCodec.java | 66 +-
.../codecs/asserting/AssertingDocValuesFormat.java | 75 +-
.../codecs/asserting/AssertingLiveDocsFormat.java | 15 +-
.../codecs/asserting/AssertingNormsFormat.java | 27 +-
.../codecs/asserting/AssertingPointsFormat.java | 26 +-
.../codecs/asserting/AssertingPostingsFormat.java | 46 +-
.../asserting/AssertingStoredFieldsFormat.java | 26 +-
.../asserting/AssertingTermVectorsFormat.java | 32 +-
.../lucene/codecs/asserting/package-info.java | 4 +-
.../lucene/codecs/blockterms/LuceneFixedGap.java | 8 +-
.../blockterms/LuceneVarGapDocFreqInterval.java | 17 +-
.../blockterms/LuceneVarGapFixedInterval.java | 13 +-
.../bloom/TestBloomFilteredLucenePostings.java | 35 +-
.../codecs/cheapbastard/CheapBastardCodec.java | 6 +-
.../lucene/codecs/cheapbastard/package-info.java | 6 +-
.../codecs/compressing/CompressingCodec.java | 141 +-
.../DeflateWithPresetCompressingCodec.java | 16 +-
.../codecs/compressing/FastCompressingCodec.java | 13 +-
.../FastDecompressionCompressingCodec.java | 13 +-
.../HighCompressionCompressingCodec.java | 13 +-
.../compressing/LZ4WithPresetCompressingCodec.java | 16 +-
.../compressing/dummy/DummyCompressingCodec.java | 118 +-
.../codecs/compressing/dummy/package-info.java | 4 +-
.../apache/lucene/codecs/cranky/CrankyCodec.java | 8 +-
.../lucene/codecs/cranky/CrankyCompoundFormat.java | 10 +-
.../codecs/cranky/CrankyDocValuesFormat.java | 26 +-
.../codecs/cranky/CrankyFieldInfosFormat.java | 15 +-
.../lucene/codecs/cranky/CrankyLiveDocsFormat.java | 10 +-
.../lucene/codecs/cranky/CrankyNormsFormat.java | 9 +-
.../lucene/codecs/cranky/CrankyPointsFormat.java | 23 +-
.../lucene/codecs/cranky/CrankyPostingsFormat.java | 17 +-
.../codecs/cranky/CrankySegmentInfoFormat.java | 9 +-
.../codecs/cranky/CrankyStoredFieldsFormat.java | 21 +-
.../codecs/cranky/CrankyTermVectorsFormat.java | 34 +-
.../apache/lucene/codecs/cranky/package-info.java | 4 +-
.../mockrandom/MockRandomPostingsFormat.java | 105 +-
.../lucene/codecs/mockrandom/package-info.java | 4 +-
.../codecs/ramonly/RAMOnlyPostingsFormat.java | 107 +-
.../apache/lucene/codecs/ramonly/package-info.java | 4 +-
.../codecs/uniformsplit/Rot13CypherTestUtil.java | 11 +-
.../UniformSplitRot13PostingsFormat.java | 25 +-
.../STUniformSplitRot13PostingsFormat.java | 25 +-
.../apache/lucene/geo/BaseGeoPointTestCase.java | 869 ++++---
.../org/apache/lucene/geo/BaseXYPointTestCase.java | 655 +++--
.../java/org/apache/lucene/geo/EarthDebugger.java | 124 +-
.../java/org/apache/lucene/geo/GeoTestUtil.java | 288 ++-
.../java/org/apache/lucene/geo/ShapeTestUtil.java | 107 +-
.../apache/lucene/index/AlcoholicMergePolicy.java | 51 +-
.../lucene/index/AllDeletedFilterReader.java | 6 +-
.../lucene/index/AssertingDirectoryReader.java | 6 +-
.../apache/lucene/index/AssertingLeafReader.java | 224 +-
.../lucene/index/BaseCompoundFormatTestCase.java | 413 ++--
.../BaseCompressingDocValuesFormatTestCase.java | 4 +-
.../lucene/index/BaseDocValuesFormatTestCase.java | 989 ++++----
.../lucene/index/BaseFieldInfoFormatTestCase.java | 246 +-
.../lucene/index/BaseIndexFileFormatTestCase.java | 563 +++--
.../lucene/index/BaseLiveDocsFormatTestCase.java | 50 +-
.../lucene/index/BaseMergePolicyTestCase.java | 375 +--
.../lucene/index/BaseNormsFormatTestCase.java | 505 ++--
.../lucene/index/BasePointsFormatTestCase.java | 569 +++--
.../lucene/index/BasePostingsFormatTestCase.java | 670 ++---
.../index/BaseSegmentInfoFormatTestCase.java | 473 ++--
.../index/BaseStoredFieldsFormatTestCase.java | 238 +-
.../index/BaseTermVectorsFormatTestCase.java | 406 +--
.../apache/lucene/index/BaseTestCheckIndex.java | 44 +-
.../java/org/apache/lucene/index/DocHelper.java | 187 +-
.../apache/lucene/index/FieldFilterLeafReader.java | 90 +-
.../org/apache/lucene/index/ForceMergePolicy.java | 10 +-
.../lucene/index/IndexWriterMaxDocsChanger.java | 16 +-
.../apache/lucene/index/MergingCodecReader.java | 41 +-
.../index/MergingDirectoryReaderWrapper.java | 22 +-
.../lucene/index/MismatchedDirectoryReader.java | 9 +-
.../apache/lucene/index/MismatchedLeafReader.java | 59 +-
.../apache/lucene/index/MockRandomMergePolicy.java | 102 +-
.../lucene/index/OwnCacheKeyMultiReader.java | 35 +-
.../org/apache/lucene/index/PerThreadPKLookup.java | 33 +-
.../apache/lucene/index/PointsStackTracker.java | 34 +-
.../java/org/apache/lucene/index/RandomCodec.java | 224 +-
.../org/apache/lucene/index/RandomIndexWriter.java | 234 +-
.../apache/lucene/index/RandomPostingsTester.java | 697 ++++--
.../ThreadedIndexingAndSearchingTestCase.java | 680 ++---
.../org/apache/lucene/mockfile/DisableFsyncFS.java | 25 +-
.../java/org/apache/lucene/mockfile/ExtrasFS.java | 43 +-
.../mockfile/FilterAsynchronousFileChannel.java | 40 +-
.../lucene/mockfile/FilterDirectoryStream.java | 31 +-
.../apache/lucene/mockfile/FilterFileChannel.java | 25 +-
.../apache/lucene/mockfile/FilterFileStore.java | 26 +-
.../apache/lucene/mockfile/FilterFileSystem.java | 39 +-
.../lucene/mockfile/FilterFileSystemProvider.java | 114 +-
.../apache/lucene/mockfile/FilterInputStream2.java | 37 +-
.../lucene/mockfile/FilterOutputStream2.java | 39 +-
.../org/apache/lucene/mockfile/FilterPath.java | 72 +-
.../lucene/mockfile/FilterSeekableByteChannel.java | 25 +-
.../org/apache/lucene/mockfile/HandleLimitFS.java | 11 +-
.../apache/lucene/mockfile/HandleTrackingFS.java | 413 ++--
.../java/org/apache/lucene/mockfile/LeakFS.java | 16 +-
.../lucene/mockfile/MockFileSystemTestCase.java | 22 +-
.../java/org/apache/lucene/mockfile/ShuffleFS.java | 23 +-
.../java/org/apache/lucene/mockfile/VerboseFS.java | 54 +-
.../apache/lucene/mockfile/VirusCheckingFS.java | 25 +-
.../java/org/apache/lucene/mockfile/WindowsFS.java | 53 +-
.../org/apache/lucene/mockfile/package-info.java | 13 +-
.../apache/lucene/search/AssertingBulkScorer.java | 11 +-
.../apache/lucene/search/AssertingCollector.java | 14 +-
.../lucene/search/AssertingIndexSearcher.java | 24 +-
.../lucene/search/AssertingLeafCollector.java | 4 +-
.../org/apache/lucene/search/AssertingMatches.java | 5 +-
.../lucene/search/AssertingMatchesIterator.java | 9 +-
.../org/apache/lucene/search/AssertingQuery.java | 11 +-
.../apache/lucene/search/AssertingScorable.java | 20 +-
.../org/apache/lucene/search/AssertingScorer.java | 116 +-
.../org/apache/lucene/search/AssertingWeight.java | 14 +-
.../lucene/search/BaseExplanationTestCase.java | 91 +-
.../lucene/search/BaseRangeFieldQueryTestCase.java | 133 +-
.../lucene/search/BlockScoreQueryWrapper.java | 9 +-
.../lucene/search/BulkScorerWrapperScorer.java | 38 +-
.../java/org/apache/lucene/search/CheckHits.java | 397 +--
.../java/org/apache/lucene/search/QueryUtils.java | 636 +++--
.../lucene/search/RandomApproximationQuery.java | 24 +-
.../apache/lucene/search/ScorerIndexSearcher.java | 31 +-
.../lucene/search/SearchEquivalenceTestBase.java | 106 +-
.../lucene/search/ShardSearchingTestBase.java | 148 +-
.../search/similarities/AssertingSimilarity.java | 15 +-
.../similarities/BaseSimilarityTestCase.java | 171 +-
.../search/similarities/RandomSimilarity.java | 37 +-
.../lucene/search/spans/AssertingSpanQuery.java | 9 +-
.../lucene/search/spans/AssertingSpanWeight.java | 10 +-
.../apache/lucene/search/spans/AssertingSpans.java | 129 +-
.../apache/lucene/search/spans/SpanTestUtil.java | 106 +-
.../apache/lucene/store/BaseDirectoryTestCase.java | 404 +--
.../apache/lucene/store/BaseDirectoryWrapper.java | 18 +-
.../lucene/store/BaseLockFactoryTestCase.java | 150 +-
.../apache/lucene/store/CorruptingIndexOutput.java | 21 +-
.../apache/lucene/store/MockDirectoryWrapper.java | 632 ++---
.../apache/lucene/store/MockIndexInputWrapper.java | 30 +-
.../lucene/store/MockIndexOutputWrapper.java | 43 +-
.../apache/lucene/store/RawDirectoryWrapper.java | 14 +-
.../store/SlowClosingMockIndexInputWrapper.java | 14 +-
.../store/SlowOpeningMockIndexInputWrapper.java | 13 +-
.../lucene/util/AbstractBeforeAfterRule.java | 11 +-
.../org/apache/lucene/util/BaseBitSetTestCase.java | 16 +-
.../apache/lucene/util/BaseDocIdSetTestCase.java | 15 +-
.../org/apache/lucene/util/CloseableDirectory.java | 10 +-
.../src/java/org/apache/lucene/util/English.java | 26 +-
.../lucene/util/FailOnNonBulkMergesInfoStream.java | 5 +-
.../java/org/apache/lucene/util/FailureMarker.java | 5 +-
.../java/org/apache/lucene/util/LineFileDocs.java | 64 +-
.../lucene/util/LuceneJUnit3MethodProvider.java | 21 +-
.../org/apache/lucene/util/LuceneTestCase.java | 1936 ++++++++-------
.../org/apache/lucene/util/NullInfoStream.java | 10 +-
.../lucene/util/QuickPatchThreadsFilter.java | 11 +-
.../org/apache/lucene/util/RamUsageTester.java | 276 ++-
.../org/apache/lucene/util/RemoveUponClose.java | 13 +-
.../src/java/org/apache/lucene/util/Rethrow.java | 16 +-
.../lucene/util/RunListenerPrintReproduceInfo.java | 93 +-
.../lucene/util/TestRuleAssertionsRequired.java | 6 +-
.../org/apache/lucene/util/TestRuleDelegate.java | 5 +-
.../util/TestRuleIgnoreAfterMaxFailures.java | 34 +-
.../lucene/util/TestRuleIgnoreTestSuites.java | 37 +-
.../apache/lucene/util/TestRuleLimitSysouts.java | 169 +-
.../apache/lucene/util/TestRuleMarkFailure.java | 28 +-
.../util/TestRuleRestoreSystemProperties.java | 26 +-
.../util/TestRuleSetupAndRestoreClassEnv.java | 173 +-
.../util/TestRuleSetupAndRestoreInstanceEnv.java | 4 +-
.../lucene/util/TestRuleSetupTeardownChained.java | 23 +-
.../apache/lucene/util/TestRuleStoreClassName.java | 13 +-
.../lucene/util/TestRuleTemporaryFilesCleanup.java | 119 +-
.../lucene/util/TestRuleThreadAndTestName.java | 13 +-
.../apache/lucene/util/TestSecurityManager.java | 72 +-
.../src/java/org/apache/lucene/util/TestUtil.java | 1119 ++++++---
.../apache/lucene/util/ThrottledIndexOutput.java | 45 +-
.../src/java/org/apache/lucene/util/TimeUnits.java | 2 +-
.../lucene/util/automaton/AutomatonTestUtil.java | 182 +-
.../java/org/apache/lucene/util/fst/FSTTester.java | 297 ++-
.../lucene/analysis/TestLookaheadTokenFilter.java | 94 +-
.../apache/lucene/analysis/TestMockAnalyzer.java | 307 ++-
.../apache/lucene/analysis/TestMockCharFilter.java | 54 +-
.../lucene/analysis/TestMockSynonymFilter.java | 199 +-
.../org/apache/lucene/analysis/TestPosition.java | 5 +-
.../lucene/analysis/TrivialLookaheadFilter.java | 20 +-
.../asserting/TestAssertingDocValuesFormat.java | 2 +-
.../codecs/asserting/TestAssertingNormsFormat.java | 4 +-
.../asserting/TestAssertingPostingsFormat.java | 2 +-
.../asserting/TestAssertingStoredFieldsFormat.java | 4 +-
.../asserting/TestAssertingTermVectorsFormat.java | 2 +-
.../TestCompressingStoredFieldsFormat.java | 75 +-
.../TestCompressingTermVectorsFormat.java | 20 +-
.../lucene/index/TestAssertingLeafReader.java | 20 +-
.../apache/lucene/index/TestForceMergePolicy.java | 3 +-
.../apache/lucene/mockfile/TestDisableFsyncFS.java | 16 +-
.../org/apache/lucene/mockfile/TestExtrasFS.java | 18 +-
.../apache/lucene/mockfile/TestHandleLimitFS.java | 21 +-
.../lucene/mockfile/TestHandleTrackingFS.java | 52 +-
.../org/apache/lucene/mockfile/TestLeakFS.java | 31 +-
.../org/apache/lucene/mockfile/TestShuffleFS.java | 55 +-
.../org/apache/lucene/mockfile/TestVerboseFS.java | 72 +-
.../lucene/mockfile/TestVirusCheckingFS.java | 11 +-
.../org/apache/lucene/mockfile/TestWindowsFS.java | 88 +-
.../lucene/search/TestBaseExplanationTestCase.java | 66 +-
.../lucene/store/TestMockDirectoryWrapper.java | 35 +-
.../src/test/org/apache/lucene/util/SorePoint.java | 7 +-
.../lucene/util/TestBeforeAfterOverrides.java | 18 +-
.../org/apache/lucene/util/TestCodecReported.java | 5 +-
.../util/TestExceptionInBeforeClassHooks.java | 83 +-
.../org/apache/lucene/util/TestExpectThrows.java | 128 +-
.../lucene/util/TestFailIfDirectoryNotClosed.java | 10 +-
.../lucene/util/TestFailIfUnreferencedFiles.java | 15 +-
.../org/apache/lucene/util/TestGroupFiltering.java | 12 +-
.../org/apache/lucene/util/TestJUnitRuleOrder.java | 40 +-
.../test/org/apache/lucene/util/TestJvmInfo.java | 28 +-
.../apache/lucene/util/TestMaxFailuresRule.java | 137 +-
.../org/apache/lucene/util/TestPleaseFail.java | 5 +-
.../util/TestRamUsageTesterOnWildAnimals.java | 8 +-
.../apache/lucene/util/TestReproduceMessage.java | 122 +-
.../util/TestReproduceMessageWithRepeated.java | 10 +-
.../util/TestRunWithRestrictedPermissions.java | 17 +-
.../apache/lucene/util/TestSeedFromUncaught.java | 22 +-
.../lucene/util/TestSetupTeardownChaining.java | 33 +-
.../org/apache/lucene/util/TestSysoutsLimits.java | 39 +-
.../lucene/util/TestWorstCaseTestBehavior.java | 44 +-
.../org/apache/lucene/util/WithNestedTests.java | 154 +-
1285 files changed, 62334 insertions(+), 49254 deletions(-)
diff --git a/gradle/generation/javacc.gradle b/gradle/generation/javacc.gradle
index 339eada..4a3dced 100644
--- a/gradle/generation/javacc.gradle
+++ b/gradle/generation/javacc.gradle
@@ -227,6 +227,22 @@ configure(project(":lucene:queryparser")) {
}
}
+ task regenerate() {
+ description "Regenerate any generated sources"
+ group "generation"
+
+ // Run regeneration tasks.
+ dependsOn javaccParserClassic, javaccParserSurround, javaccParserFlexible
+
+ // Clean up and reformat the generated sources after generation.
+ dependsOn "tidy"
+ }
+
+ // Make sure tidy runs after generation, if they're defined.
+ tasks.matching { it.name == "tidy" }.configureEach {
+ mustRunAfter javaccParserClassic, javaccParserSurround, javaccParserFlexible
+ }
+
task javacc() {
description "Regenerate query parsers (javacc syntax definitions)."
group "generation"
@@ -244,7 +260,6 @@ configure(project(":solr:core")) {
javaccFile = file('src/java/org/apache/solr/parser/QueryParser.jj')
-
afterGenerate << commonCleanups
afterGenerate << { FileTree generatedFiles ->
generatedFiles.matching { include "QueryParser.java" }.each { file ->
diff --git a/gradle/validation/spotless.gradle b/gradle/validation/spotless.gradle
index 3dc3deb..148ec5b 100644
--- a/gradle/validation/spotless.gradle
+++ b/gradle/validation/spotless.gradle
@@ -16,116 +16,89 @@
*/
/*
- * LUCENE-9564: This adds automatic (and enforced) code formatting.
+ * LUCENE-9564: This adds automatic (and enforced) code formatting using
+ * spotless and Google Java Format.
*/
def resources = scriptResources(buildscript)
-allprojects { prj ->
+configure(project(":lucene").subprojects) { prj ->
plugins.withType(JavaPlugin) {
prj.apply plugin: 'com.diffplug.spotless'
spotless {
java {
- // TODO: work out how to have multiple different header files (we have
- // classes in the codebase that have original headers).
+ // TODO: Work out how to support multiple different header files (we have
+ // classes in the codebase that have original headers). We currently use
+ // Apache RAT to enforce headers so this is of lesser priority.
+ //
// licenseHeaderFile file("${resources}/asl-header.txt"), '^(\\s*package)'
lineEndings 'UNIX'
endWithNewline()
googleJavaFormat('1.9')
+ // Apply to all Java sources
+ target "src/**/*.java"
+
+ // Exclude certain files (generated ones, mostly).
switch (project.path) {
- // These modules are complete - all sources scanned.
case ":lucene:core":
- target "src/java/**/*.java",
- "src/test/**/*.java"
- targetExclude "**/resources/**", "**/StandardTokenizerImpl.java"
- break
-
- case ":lucene:highlighter":
- target "src/java/**/*.java",
- "src/test/**/*.java"
- targetExclude "**/resources/**"
- break
-
- case ":lucene:queries":
- target "src/java/**/*.java",
- "src/test/**/*.java"
- targetExclude "**/resources/**"
+ targetExclude "**/StandardTokenizerImpl.java"
break
case ":lucene:analysis:common":
- target "src/**/*.java"
- targetExclude "**/resources/**",
- "**/HTMLStripCharFilter.java",
+ targetExclude "**/HTMLStripCharFilter.java",
"**/UAX29URLEmailTokenizerImpl.java",
"**/tartarus/**"
break
- case ":lucene:demo":
- case ":lucene:analysis:morfologik":
- case ":lucene:analysis:icu":
- case ":lucene:analysis:kuromoji":
- case ":lucene:memory":
- case ":lucene:benchmark":
- case ":lucene:analysis:nori":
- case ":lucene:analysis:opennlp":
- case ":lucene:analysis:phonetic":
- case ":lucene:analysis:smartcn":
- case ":lucene:analysis:stempel":
- case ":lucene:classification":
- case ":lucene:backward-codecs":
- case ":lucene:codecs":
- case ":lucene:join":
- target "src/**/*.java"
- targetExclude "**/resources/**"
+ case ":lucene:test-framework":
+ targetExclude "**/EmojiTokenizationTestUnicode_11_0.java",
+ "**/WordBreakTestUnicode_9_0_0.java"
break
case ":lucene:expressions":
- target "src/**/*.java"
- targetExclude "**/resources/**", "**/JavascriptLexer.java", "**/JavascriptParser.java",
+ targetExclude "**/JavascriptLexer.java",
+ "**/JavascriptParser.java",
"**/JavascriptVisitor.java"
break
- // Partially complete.
-
- case ":lucene:facet":
- target "src/**/*.java"
- targetExclude "**/taxonomy.8.6.3-cfs.zip"
- break
-
- // All others - disable reformatting/ checks for now.
- case ":lucene:grouping":
- case ":lucene:luke":
- case ":lucene:misc":
- case ":lucene:monitor":
case ":lucene:queryparser":
- case ":lucene:replicator":
- case ":lucene:sandbox":
- case ":lucene:spatial3d":
- case ":lucene:spatial-extras":
- case ":lucene:suggest":
- case ":lucene:test-framework":
-
- default:
- target 'non-existing/**'
+ targetExclude "**/classic/ParseException.java",
+ "**/classic/QueryParser.java",
+ "**/classic/QueryParserConstants.java",
+ "**/classic/QueryParserTokenManager.java",
+ "**/classic/Token.java",
+ "**/classic/TokenMgrError.java",
+ "**/standard/parser/ParseException.java",
+ "**/standard/parser/StandardSyntaxParser.java",
+ "**/standard/parser/StandardSyntaxParserConstants.java",
+ "**/standard/parser/StandardSyntaxParserTokenManager.java",
+ "**/standard/parser/Token.java",
+ "**/standard/parser/TokenMgrError.java",
+ "**/surround/parser/ParseException.java",
+ "**/surround/parser/QueryParser.java",
+ "**/surround/parser/QueryParserConstants.java",
+ "**/surround/parser/QueryParserTokenManager.java",
+ "**/surround/parser/Token.java",
+ "**/surround/parser/TokenMgrError.java"
break
}
}
}
+ // Workaround for an odd problem in spotless where it fails because
+ // of a missing folder.
spotlessJava {
doFirst {
project.mkdir("${buildDir}/spotless/spotlessJava")
}
}
}
-}
-// Add an alias to 'spotlessApply' simply called 'tidy' and add
-// spotlessCheck to check.
-allprojects { prj ->
+ // Add an alias to 'spotlessApply' simply called 'tidy' and wire up
+ // spotlessCheck to convention's check.
task tidy() {
description "Applies formatters and cleanups to sources."
group "verification"
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 742aed2..bb5bdb3 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -191,6 +191,10 @@ Bug fixes
Other
+* LUCENE-9570, LUCENE-9564: Apply google java format and enforce it on source Java files.
+ Review diffs and correct automatic formatting oddities. (Erick Erickson,
+ Bruno Roustant, Dawid Weiss)
+
* LUCENE-9631: Properly override slice() on subclasses of OffsetRange. (Dawid Weiss)
* LUCENE-9312: Allow gradle builds against arbitrary JVMs. (Tomoko Uchida, Dawid Weiss)
diff --git a/lucene/core/src/java/org/apache/lucene/search/HitQueue.java b/lucene/core/src/java/org/apache/lucene/search/HitQueue.java
index 9998452..dc2a7e5 100644
--- a/lucene/core/src/java/org/apache/lucene/search/HitQueue.java
+++ b/lucene/core/src/java/org/apache/lucene/search/HitQueue.java
@@ -76,7 +76,10 @@ public final class HitQueue extends PriorityQueue<ScoreDoc> {
@Override
protected final boolean lessThan(ScoreDoc hitA, ScoreDoc hitB) {
- if (hitA.score == hitB.score) return hitA.doc > hitB.doc;
- else return hitA.score < hitB.score;
+ if (hitA.score == hitB.score) {
+ return hitA.doc > hitB.doc;
+ } else {
+ return hitA.score < hitB.score;
+ }
}
}
diff --git a/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java b/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java
index a9835a0..39a67ff 100644
--- a/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java
@@ -177,9 +177,8 @@ public class NIOFSDirectory extends FSDirectory {
b.limit(b.position() + toRead);
assert b.remaining() == toRead;
final int i = channel.read(b, pos);
- if (i
- < 0) { // be defensive here, even though we checked before hand, something could have
- // changed
+ if (i < 0) {
+ // be defensive here, even though we checked before hand, something could have changed
throw new EOFException(
"read past EOF: "
+ this
@@ -191,7 +190,8 @@ public class NIOFSDirectory extends FSDirectory {
+ end);
}
assert i > 0
- : "FileChannel.read with non zero-length bb.remaining() must always read at least one byte (FileChannel is in blocking mode, see spec of ReadableByteChannel)";
+ : "FileChannel.read with non zero-length bb.remaining() must always read at least "
+ + "one byte (FileChannel is in blocking mode, see spec of ReadableByteChannel)";
pos += i;
readLength -= i;
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupHeadsCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupHeadsCollector.java
index f680385..56a2d3d 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupHeadsCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupHeadsCollector.java
@@ -20,7 +20,6 @@ import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.FieldComparator;
@@ -33,14 +32,14 @@ import org.apache.lucene.search.SortField;
import org.apache.lucene.util.FixedBitSet;
/**
- * This collector specializes in collecting the most relevant document (group head) for each
- * group that matches the query.
+ * This collector specializes in collecting the most relevant document (group head) for each group
+ * that matches the query.
*
- * Clients should create new collectors by calling {@link #newCollector(GroupSelector, Sort)}
+ * <p>Clients should create new collectors by calling {@link #newCollector(GroupSelector, Sort)}
*
* @lucene.experimental
*/
-@SuppressWarnings({"unchecked","rawtypes"})
+@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
private final GroupSelector<T> groupSelector;
@@ -56,13 +55,15 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
/**
* Create a new AllGroupHeadsCollector based on the type of within-group Sort required
+ *
* @param selector a GroupSelector to define the groups
- * @param sort the within-group sort to use to choose the group head document
- * @param <T> the group value type
+ * @param sort the within-group sort to use to choose the group head document
+ * @param <T> the group value type
*/
public static <T> AllGroupHeadsCollector<T> newCollector(GroupSelector<T> selector, Sort sort) {
- if (sort.equals(Sort.RELEVANCE))
+ if (sort.equals(Sort.RELEVANCE)) {
return new ScoringGroupHeadsCollector<>(selector, sort);
+ }
return new SortingGroupHeadsCollector<>(selector, sort);
}
@@ -93,7 +94,8 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
}
/**
- * @return an int array containing all group heads. The size of the array is equal to number of collected unique groups.
+ * @return an int array containing all group heads. The size of the array is equal to number of
+ * collected unique groups.
*/
public int[] retrieveGroupHeads() {
Collection<? extends GroupHead<T>> groupHeads = getCollectedGroupHeads();
@@ -107,16 +109,13 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
return docHeads;
}
- /**
- * @return the number of group heads found for a query.
- */
+ /** @return the number of group heads found for a query. */
public int groupHeadsSize() {
return getCollectedGroupHeads().size();
}
/**
- * Returns the collected group heads.
- * Subsequent calls should return the same group heads.
+ * Returns the collected group heads. Subsequent calls should return the same group heads.
*
* @return the collected group heads
*/
@@ -179,49 +178,46 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
/**
* Create a new GroupHead for the given group value, initialized with a doc, context and scorer
*/
- protected abstract GroupHead<T> newGroupHead(int doc, T value, LeafReaderContext context, Scorable scorer) throws IOException;
+ protected abstract GroupHead<T> newGroupHead(
+ int doc, T value, LeafReaderContext context, Scorable scorer) throws IOException;
/**
- * Represents a group head. A group head is the most relevant document for a particular group.
- * The relevancy is based is usually based on the sort.
+ * Represents a group head. A group head is the most relevant document for a particular group. The
+ * relevancy is based is usually based on the sort.
*
- * The group head contains a group value with its associated most relevant document id.
+ * <p>The group head contains a group value with its associated most relevant document id.
*/
- public static abstract class GroupHead<T> {
+ public abstract static class GroupHead<T> {
public final T groupValue;
public int doc;
protected int docBase;
- /**
- * Create a new GroupHead for the given value
- */
+ /** Create a new GroupHead for the given value */
protected GroupHead(T groupValue, int doc, int docBase) {
this.groupValue = groupValue;
this.doc = doc + docBase;
this.docBase = docBase;
}
- /**
- * Called for each segment
- */
+ /** Called for each segment */
protected void setNextReader(LeafReaderContext ctx) throws IOException {
this.docBase = ctx.docBase;
}
- /**
- * Called for each segment
- */
+ /** Called for each segment */
protected abstract void setScorer(Scorable scorer) throws IOException;
/**
- * Compares the specified document for a specified comparator against the current most relevant document.
+ * Compares the specified document for a specified comparator against the current most relevant
+ * document.
*
* @param compIDX The comparator index of the specified comparator.
* @param doc The specified document.
- * @return -1 if the specified document wasn't competitive against the current most relevant document, 1 if the
- * specified document was competitive against the current most relevant document. Otherwise 0.
+ * @return -1 if the specified document wasn't competitive against the current most relevant
+ * document, 1 if the specified document was competitive against the current most relevant
+ * document. Otherwise 0.
* @throws IOException If I/O related errors occur
*/
protected abstract int compare(int compIDX, int doc) throws IOException;
@@ -233,12 +229,9 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
* @throws IOException If I/O related errors occur
*/
protected abstract void updateDocHead(int doc) throws IOException;
-
}
- /**
- * General implementation using a {@link FieldComparator} to select the group head
- */
+ /** General implementation using a {@link FieldComparator} to select the group head */
private static class SortingGroupHeadsCollector<T> extends AllGroupHeadsCollector<T> {
protected SortingGroupHeadsCollector(GroupSelector<T> selector, Sort sort) {
@@ -246,7 +239,8 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
}
@Override
- protected GroupHead<T> newGroupHead(int doc, T value, LeafReaderContext ctx, Scorable scorer) throws IOException {
+ protected GroupHead<T> newGroupHead(int doc, T value, LeafReaderContext ctx, Scorable scorer)
+ throws IOException {
return new SortingGroupHead<>(sort, value, doc, ctx, scorer);
}
}
@@ -256,7 +250,9 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
final FieldComparator[] comparators;
final LeafFieldComparator[] leafComparators;
- protected SortingGroupHead(Sort sort, T groupValue, int doc, LeafReaderContext context, Scorable scorer) throws IOException {
+ protected SortingGroupHead(
+ Sort sort, T groupValue, int doc, LeafReaderContext context, Scorable scorer)
+ throws IOException {
super(groupValue, doc, context.docBase);
final SortField[] sortFields = sort.getSort();
comparators = new FieldComparator[sortFields.length];
@@ -300,9 +296,7 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
}
}
- /**
- * Specialized implementation for sorting by score
- */
+ /** Specialized implementation for sorting by score */
private static class ScoringGroupHeadsCollector<T> extends AllGroupHeadsCollector<T> {
protected ScoringGroupHeadsCollector(GroupSelector<T> selector, Sort sort) {
@@ -310,7 +304,8 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
}
@Override
- protected GroupHead<T> newGroupHead(int doc, T value, LeafReaderContext context, Scorable scorer) throws IOException {
+ protected GroupHead<T> newGroupHead(
+ int doc, T value, LeafReaderContext context, Scorable scorer) throws IOException {
return new ScoringGroupHead<>(scorer, value, doc, context.docBase);
}
}
@@ -320,7 +315,8 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
private Scorable scorer;
private float topScore;
- protected ScoringGroupHead(Scorable scorer, T groupValue, int doc, int docBase) throws IOException {
+ protected ScoringGroupHead(Scorable scorer, T groupValue, int doc, int docBase)
+ throws IOException {
super(groupValue, doc, docBase);
assert scorer.docID() == doc;
this.scorer = scorer;
@@ -338,8 +334,9 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
assert compIDX == 0;
float score = scorer.score();
int c = Float.compare(score, topScore);
- if (c > 0)
+ if (c > 0) {
topScore = score;
+ }
return c;
}
@@ -348,5 +345,4 @@ public abstract class AllGroupHeadsCollector<T> extends SimpleCollector {
this.doc = doc + docBase;
}
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupsCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupsCollector.java
index 30ea490..41d6a99 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupsCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/AllGroupsCollector.java
@@ -20,17 +20,14 @@ import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.Scorable;
import org.apache.lucene.search.ScoreMode;
import org.apache.lucene.search.SimpleCollector;
/**
- * A collector that collects all groups that match the
- * query. Only the group value is collected, and the order
- * is undefined. This collector does not determine
- * the most relevant document of a group.
+ * A collector that collects all groups that match the query. Only the group value is collected, and
+ * the order is undefined. This collector does not determine the most relevant document of a group.
*
* @lucene.experimental
*/
@@ -42,6 +39,7 @@ public class AllGroupsCollector<T> extends SimpleCollector {
/**
* Create a new AllGroupsCollector
+ *
* @param groupSelector the GroupSelector to determine groups
*/
public AllGroupsCollector(GroupSelector<T> groupSelector) {
@@ -49,8 +47,10 @@ public class AllGroupsCollector<T> extends SimpleCollector {
}
/**
- * Returns the total number of groups for the executed search.
- * This is a convenience method. The following code snippet has the same effect: <pre>getGroups().size()</pre>
+ * Returns the total number of groups for the executed search. This is a convenience method. The
+ * following code snippet has the same effect:
+ *
+ * <pre>getGroups().size()</pre>
*
* @return The total number of groups for the executed search
*/
@@ -60,8 +60,8 @@ public class AllGroupsCollector<T> extends SimpleCollector {
/**
* Returns the group values
- * <p>
- * This is an unordered collections of group values.
+ *
+ * <p>This is an unordered collections of group values.
*
* @return the group values
*/
@@ -80,8 +80,9 @@ public class AllGroupsCollector<T> extends SimpleCollector {
@Override
public void collect(int doc) throws IOException {
groupSelector.advanceTo(doc);
- if (groups.contains(groupSelector.currentValue()))
+ if (groups.contains(groupSelector.currentValue())) {
return;
+ }
groups.add(groupSelector.copyValue());
}
@@ -89,4 +90,4 @@ public class AllGroupsCollector<T> extends SimpleCollector {
public ScoreMode scoreMode() {
return ScoreMode.COMPLETE_NO_SCORES; // the result is unaffected by relevancy
}
-}
\ No newline at end of file
+}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
index bbeb2ee..226aca0 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
@@ -17,7 +17,6 @@
package org.apache.lucene.search.grouping;
import java.io.IOException;
-
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.DocIdSetIterator;
@@ -40,29 +39,22 @@ import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.PriorityQueue;
// TODO: this sentence is too long for the class summary.
-/** BlockGroupingCollector performs grouping with a
- * single pass collector, as long as you are grouping by a
- * doc block field, ie all documents sharing a given group
- * value were indexed as a doc block using the atomic
- * {@link IndexWriter#addDocuments IndexWriter.addDocuments()}
- * or {@link IndexWriter#updateDocuments IndexWriter.updateDocuments()}
- * API.
+/**
+ * BlockGroupingCollector performs grouping with a single pass collector, as long as you are
+ * grouping by a doc block field, ie all documents sharing a given group value were indexed as a doc
+ * block using the atomic {@link IndexWriter#addDocuments IndexWriter.addDocuments()} or {@link
+ * IndexWriter#updateDocuments IndexWriter.updateDocuments()} API.
*
- * <p>This results in faster performance (~25% faster QPS)
- * than the two-pass grouping collectors, with the tradeoff
- * being that the documents in each group must always be
- * indexed as a block. This collector also fills in
- * TopGroups.totalGroupCount without requiring the separate
- * {@link org.apache.lucene.search.grouping.AllGroupsCollector}. However, this collector does
- * not fill in the groupValue of each group; this field
- * will always be null.
+ * <p>This results in faster performance (~25% faster QPS) than the two-pass grouping collectors,
+ * with the tradeoff being that the documents in each group must always be indexed as a block. This
+ * collector also fills in TopGroups.totalGroupCount without requiring the separate {@link
+ * org.apache.lucene.search.grouping.AllGroupsCollector}. However, this collector does not fill in
+ * the groupValue of each group; this field will always be null.
*
- * <p><b>NOTE</b>: this collector makes no effort to verify
- * the docs were in fact indexed as a block, so it's up to
- * you to ensure this was the case.
+ * <p><b>NOTE</b>: this collector makes no effort to verify the docs were in fact indexed as a
+ * block, so it's up to you to ensure this was the case.
*
- * <p>See {@link org.apache.lucene.search.grouping} for more
- * details including a full code example.</p>
+ * <p>See {@link org.apache.lucene.search.grouping} for more details including a full code example.
*
* @lucene.experimental
*/
@@ -104,14 +96,14 @@ public class BlockGroupingCollector extends SimpleCollector {
private static final class OneGroup {
LeafReaderContext readerContext;
- //int groupOrd;
+ // int groupOrd;
int topGroupDoc;
int[] docs;
float[] scores;
int count;
int comparatorSlot;
}
-
+
// Sorts by groupSort. Not static -- uses comparators, reversed
private final class GroupQueue extends PriorityQueue<OneGroup> {
@@ -122,13 +114,15 @@ public class BlockGroupingCollector extends SimpleCollector {
@Override
protected boolean lessThan(final OneGroup group1, final OneGroup group2) {
- //System.out.println(" ltcheck");
+ // System.out.println(" ltcheck");
assert group1 != group2;
assert group1.comparatorSlot != group2.comparatorSlot;
final int numComparators = comparators.length;
- for (int compIDX=0;compIDX < numComparators; compIDX++) {
- final int c = reversed[compIDX] * comparators[compIDX].compare(group1.comparatorSlot, group2.comparatorSlot);
+ for (int compIDX = 0; compIDX < numComparators; compIDX++) {
+ final int c =
+ reversed[compIDX]
+ * comparators[compIDX].compare(group1.comparatorSlot, group2.comparatorSlot);
if (c != 0) {
// Short circuit
return c > 0;
@@ -144,7 +138,8 @@ public class BlockGroupingCollector extends SimpleCollector {
// group is competitive we insert into the group queue
private void processGroup() throws IOException {
totalGroupCount++;
- //System.out.println(" processGroup ord=" + lastGroupOrd + " competes=" + groupCompetes + " count=" + subDocUpto + " groupDoc=" + topGroupDoc);
+ // System.out.println(" processGroup ord=" + lastGroupOrd + " competes=" + groupCompetes + "
+ // count=" + subDocUpto + " groupDoc=" + topGroupDoc);
if (groupCompetes) {
if (!queueFull) {
// Startup transient: always add a new OneGroup
@@ -158,20 +153,21 @@ public class BlockGroupingCollector extends SimpleCollector {
pendingSubScores = new float[10];
}
og.readerContext = currentReaderContext;
- //og.groupOrd = lastGroupOrd;
+ // og.groupOrd = lastGroupOrd;
og.comparatorSlot = bottomSlot;
final OneGroup bottomGroup = groupQueue.add(og);
- //System.out.println(" ADD group=" + getGroupString(lastGroupOrd) + " newBottom=" + getGroupString(bottomGroup.groupOrd));
+ // System.out.println(" ADD group=" + getGroupString(lastGroupOrd) + " newBottom=" +
+ // getGroupString(bottomGroup.groupOrd));
queueFull = groupQueue.size() == topNGroups;
if (queueFull) {
// Queue just became full; now set the real bottom
// in the comparators:
bottomSlot = bottomGroup.comparatorSlot;
- //System.out.println(" set bottom=" + bottomSlot);
+ // System.out.println(" set bottom=" + bottomSlot);
for (int i = 0; i < comparators.length; i++) {
leafComparators[i].setBottom(bottomSlot);
}
- //System.out.println(" QUEUE FULL");
+ // System.out.println(" QUEUE FULL");
} else {
// Queue not full yet -- just advance bottomSlot:
bottomSlot = groupQueue.size();
@@ -193,10 +189,10 @@ public class BlockGroupingCollector extends SimpleCollector {
pendingSubScores = savScores;
}
og.readerContext = currentReaderContext;
- //og.groupOrd = lastGroupOrd;
+ // og.groupOrd = lastGroupOrd;
bottomSlot = groupQueue.updateTop().comparatorSlot;
- //System.out.println(" set bottom=" + bottomSlot);
+ // System.out.println(" set bottom=" + bottomSlot);
for (int i = 0; i < comparators.length; i++) {
leafComparators[i].setBottom(bottomSlot);
}
@@ -208,22 +204,17 @@ public class BlockGroupingCollector extends SimpleCollector {
/**
* Create the single pass collector.
*
- * @param groupSort The {@link Sort} used to sort the
- * groups. The top sorted document within each group
- * according to groupSort, determines how that group
- * sorts against other groups. This must be non-null,
- * ie, if you want to groupSort by relevance use
- * Sort.RELEVANCE.
- * @param topNGroups How many top groups to keep.
- * @param needsScores true if the collected documents
- * require scores, either because relevance is included
- * in the withinGroupSort or because you plan to pass true
- * for either getSscores or getMaxScores to {@link
- * #getTopGroups}
- * @param lastDocPerGroup a {@link Weight} that marks the
- * last document in each group.
+ * @param groupSort The {@link Sort} used to sort the groups. The top sorted document within each
+ * group according to groupSort, determines how that group sorts against other groups. This
+ * must be non-null, ie, if you want to groupSort by relevance use Sort.RELEVANCE.
+ * @param topNGroups How many top groups to keep.
+ * @param needsScores true if the collected documents require scores, either because relevance is
+ * included in the withinGroupSort or because you plan to pass true for either getSscores or
+ * getMaxScores to {@link #getTopGroups}
+ * @param lastDocPerGroup a {@link Weight} that marks the last document in each group.
*/
- public BlockGroupingCollector(Sort groupSort, int topNGroups, boolean needsScores, Weight lastDocPerGroup) {
+ public BlockGroupingCollector(
+ Sort groupSort, int topNGroups, boolean needsScores, Weight lastDocPerGroup) {
if (topNGroups < 1) {
throw new IllegalArgumentException("topNGroups must be >= 1 (got " + topNGroups + ")");
@@ -239,7 +230,7 @@ public class BlockGroupingCollector extends SimpleCollector {
this.lastDocPerGroup = lastDocPerGroup;
this.groupSort = groupSort;
-
+
this.topNGroups = topNGroups;
final SortField[] sortFields = groupSort.getSort();
@@ -259,29 +250,26 @@ public class BlockGroupingCollector extends SimpleCollector {
// typically they will be presented as a "single" result
// in the UI?
- /** Returns the grouped results. Returns null if the
- * number of groups collected is <= groupOffset.
+ /**
+ * Returns the grouped results. Returns null if the number of groups collected is <=
+ * groupOffset.
*
- * <p><b>NOTE</b>: This collector is unable to compute
- * the groupValue per group so it will always be null.
- * This is normally not a problem, as you can obtain the
- * value just like you obtain other values for each
- * matching document (eg, via stored fields, via
- * DocValues, etc.)
+ * <p><b>NOTE</b>: This collector is unable to compute the groupValue per group so it will always
+ * be null. This is normally not a problem, as you can obtain the value just like you obtain other
+ * values for each matching document (eg, via stored fields, via DocValues, etc.)
*
- * @param withinGroupSort The {@link Sort} used to sort
- * documents within each group.
- * @param groupOffset Which group to start from
- * @param withinGroupOffset Which document to start from
- * within each group
- * @param maxDocsPerGroup How many top documents to keep
- * within each group.
+ * @param withinGroupSort The {@link Sort} used to sort documents within each group.
+ * @param groupOffset Which group to start from
+ * @param withinGroupOffset Which document to start from within each group
+ * @param maxDocsPerGroup How many top documents to keep within each group.
*/
- public TopGroups<?> getTopGroups(Sort withinGroupSort, int groupOffset, int withinGroupOffset, int maxDocsPerGroup) throws IOException {
+ public TopGroups<?> getTopGroups(
+ Sort withinGroupSort, int groupOffset, int withinGroupOffset, int maxDocsPerGroup)
+ throws IOException {
- //if (queueFull) {
- //System.out.println("getTopGroups groupOffset=" + groupOffset + " topNGroups=" + topNGroups);
- //}
+ // if (queueFull) {
+ // System.out.println("getTopGroups groupOffset=" + groupOffset + " topNGroups=" + topNGroups);
+ // }
if (subDocUpto != 0) {
processGroup();
}
@@ -294,9 +282,9 @@ public class BlockGroupingCollector extends SimpleCollector {
float maxScore = Float.MIN_VALUE;
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
final GroupDocs<Object>[] groups = new GroupDocs[groupQueue.size() - groupOffset];
- for(int downTo=groupQueue.size()-groupOffset-1;downTo>=0;downTo--) {
+ for (int downTo = groupQueue.size() - groupOffset - 1; downTo >= 0; downTo--) {
final OneGroup og = groupQueue.pop();
// At this point we hold all docs w/ in each group,
@@ -305,18 +293,21 @@ public class BlockGroupingCollector extends SimpleCollector {
if (withinGroupSort.equals(Sort.RELEVANCE)) {
// Sort by score
if (!needsScores) {
- throw new IllegalArgumentException("cannot sort by relevance within group: needsScores=false");
+ throw new IllegalArgumentException(
+ "cannot sort by relevance within group: needsScores=false");
}
collector = TopScoreDocCollector.create(maxDocsPerGroup, Integer.MAX_VALUE);
} else {
// Sort by fields
- collector = TopFieldCollector.create(withinGroupSort, maxDocsPerGroup, Integer.MAX_VALUE); // TODO: disable exact counts?
+ collector =
+ TopFieldCollector.create(
+ withinGroupSort, maxDocsPerGroup, Integer.MAX_VALUE); // TODO: disable exact counts?
}
float groupMaxScore = needsScores ? Float.NEGATIVE_INFINITY : Float.NaN;
LeafCollector leafCollector = collector.getLeafCollector(og.readerContext);
leafCollector.setScorer(fakeScorer);
- for(int docIDX=0;docIDX<og.count;docIDX++) {
+ for (int docIDX = 0; docIDX < og.count; docIDX++) {
final int doc = og.docs[docIDX];
fakeScorer.doc = doc;
if (needsScores) {
@@ -330,7 +321,7 @@ public class BlockGroupingCollector extends SimpleCollector {
final Object[] groupSortValues;
groupSortValues = new Comparable<?>[comparators.length];
- for(int sortFieldIDX=0;sortFieldIDX<comparators.length;sortFieldIDX++) {
+ for (int sortFieldIDX = 0; sortFieldIDX < comparators.length; sortFieldIDX++) {
groupSortValues[sortFieldIDX] = comparators[sortFieldIDX].value(og.comparatorSlot);
}
@@ -338,12 +329,14 @@ public class BlockGroupingCollector extends SimpleCollector {
// TODO: we could aggregate scores across children
// by Sum/Avg instead of passing NaN:
- groups[downTo] = new GroupDocs<>(Float.NaN,
- groupMaxScore,
- new TotalHits(og.count, TotalHits.Relation.EQUAL_TO),
- topDocs.scoreDocs,
- null,
- groupSortValues);
+ groups[downTo] =
+ new GroupDocs<>(
+ Float.NaN,
+ groupMaxScore,
+ new TotalHits(og.count, TotalHits.Relation.EQUAL_TO),
+ topDocs.scoreDocs,
+ null,
+ groupSortValues);
maxScore = Math.max(maxScore, groupMaxScore);
}
@@ -355,10 +348,15 @@ public class BlockGroupingCollector extends SimpleCollector {
}
*/
- return new TopGroups<>(new TopGroups<>(groupSort.getSort(),
- withinGroupSort.getSort(),
- totalHitCount, totalGroupedHitCount, groups, maxScore),
- totalGroupCount);
+ return new TopGroups<>(
+ new TopGroups<>(
+ groupSort.getSort(),
+ withinGroupSort.getSort(),
+ totalHitCount,
+ totalGroupedHitCount,
+ groups,
+ maxScore),
+ totalGroupCount);
}
@Override
@@ -380,7 +378,7 @@ public class BlockGroupingCollector extends SimpleCollector {
processGroup();
}
groupEndDocID = lastDocPerGroupBits.advance(doc);
- //System.out.println(" adv " + groupEndDocID + " " + lastDocPerGroupBits);
+ // System.out.println(" adv " + groupEndDocID + " " + lastDocPerGroupBits);
subDocUpto = 0;
groupCompetes = !queueFull;
}
@@ -404,15 +402,15 @@ public class BlockGroupingCollector extends SimpleCollector {
if (subDocUpto == 1) {
assert !queueFull;
- //System.out.println(" init copy to bottomSlot=" + bottomSlot);
+ // System.out.println(" init copy to bottomSlot=" + bottomSlot);
for (LeafFieldComparator fc : leafComparators) {
fc.copy(bottomSlot, doc);
fc.setBottom(bottomSlot);
- }
+ }
topGroupDoc = doc;
} else {
// Compare to bottomSlot
- for (int compIDX = 0;; compIDX++) {
+ for (int compIDX = 0; ; compIDX++) {
final int c = reversed[compIDX] * leafComparators[compIDX].compareBottom(doc);
if (c < 0) {
// Definitely not competitive -- done
@@ -428,25 +426,25 @@ public class BlockGroupingCollector extends SimpleCollector {
}
}
- //System.out.println(" best w/in group!");
-
+ // System.out.println(" best w/in group!");
+
for (LeafFieldComparator fc : leafComparators) {
fc.copy(bottomSlot, doc);
// Necessary because some comparators cache
// details of bottom slot; this forces them to
// re-cache:
fc.setBottom(bottomSlot);
- }
+ }
topGroupDoc = doc;
}
} else {
// We're not sure this group will make it into the
// queue yet
- for (int compIDX = 0;; compIDX++) {
+ for (int compIDX = 0; ; compIDX++) {
final int c = reversed[compIDX] * leafComparators[compIDX].compareBottom(doc);
if (c < 0) {
// Definitely not competitive -- done
- //System.out.println(" doc doesn't compete w/ top groups");
+ // System.out.println(" doc doesn't compete w/ top groups");
return;
} else if (c > 0) {
// Definitely competitive.
@@ -455,7 +453,7 @@ public class BlockGroupingCollector extends SimpleCollector {
// Ties with bottom, except we know this docID is
// > docID in the queue (docs are visited in
// order), so not competitive:
- //System.out.println(" doc doesn't compete w/ top groups");
+ // System.out.println(" doc doesn't compete w/ top groups");
return;
}
}
@@ -468,7 +466,7 @@ public class BlockGroupingCollector extends SimpleCollector {
fc.setBottom(bottomSlot);
}
topGroupDoc = doc;
- //System.out.println(" doc competes w/ top groups");
+ // System.out.println(" doc competes w/ top groups");
}
}
@@ -479,7 +477,7 @@ public class BlockGroupingCollector extends SimpleCollector {
}
subDocUpto = 0;
docBase = readerContext.docBase;
- //System.out.println("setNextReader base=" + docBase + " r=" + readerContext.reader);
+ // System.out.println("setNextReader base=" + docBase + " r=" + readerContext.reader);
Scorer s = lastDocPerGroup.scorer(readerContext);
if (s == null) {
lastDocPerGroupBits = null;
@@ -489,7 +487,7 @@ public class BlockGroupingCollector extends SimpleCollector {
groupEndDocID = -1;
currentReaderContext = readerContext;
- for (int i=0; i<comparators.length; i++) {
+ for (int i = 0; i < comparators.length; i++) {
leafComparators[i] = comparators[i].getLeafComparator(readerContext);
}
}
@@ -513,6 +511,5 @@ public class BlockGroupingCollector extends SimpleCollector {
public float score() {
return score;
}
-
}
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/CollectedSearchGroup.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/CollectedSearchGroup.java
index 5e4bf14..a6a3c32 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/CollectedSearchGroup.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/CollectedSearchGroup.java
@@ -18,10 +18,12 @@ package org.apache.lucene.search.grouping;
import org.apache.lucene.search.FieldComparator; // javadocs
-/**
- * Expert: representation of a group in {@link FirstPassGroupingCollector},
- * tracking the top doc and {@link FieldComparator} slot.
- * @lucene.internal */
+/**
+ * Expert: representation of a group in {@link FirstPassGroupingCollector}, tracking the top doc and
+ * {@link FieldComparator} slot.
+ *
+ * @lucene.internal
+ */
public class CollectedSearchGroup<T> extends SearchGroup<T> {
int topDoc;
int comparatorSlot;
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DistinctValuesCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DistinctValuesCollector.java
index ee38159..0d7d3e8 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DistinctValuesCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DistinctValuesCollector.java
@@ -22,13 +22,13 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.ScoreMode;
import org.apache.lucene.search.SimpleCollector;
/**
- * A second pass grouping collector that keeps track of distinct values for a specified field for the top N group.
+ * A second pass grouping collector that keeps track of distinct values for a specified field for
+ * the top N group.
*
* @lucene.experimental
*/
@@ -36,12 +36,15 @@ public class DistinctValuesCollector<T, R> extends SecondPassGroupingCollector<T
/**
* Create a DistinctValuesCollector
+ *
* @param groupSelector the group selector to determine the top-level groups
- * @param groups the top-level groups to collect for
+ * @param groups the top-level groups to collect for
* @param valueSelector a group selector to determine which values to collect per-group
*/
- public DistinctValuesCollector(GroupSelector<T> groupSelector, Collection<SearchGroup<T>> groups,
- GroupSelector<R> valueSelector) {
+ public DistinctValuesCollector(
+ GroupSelector<T> groupSelector,
+ Collection<SearchGroup<T>> groups,
+ GroupSelector<R> valueSelector) {
super(groupSelector, groups, new DistinctValuesReducer<>(valueSelector));
}
@@ -58,12 +61,9 @@ public class DistinctValuesCollector<T, R> extends SecondPassGroupingCollector<T
public void collect(int doc) throws IOException {
if (valueSelector.advanceTo(doc) == GroupSelector.State.ACCEPT) {
R value = valueSelector.currentValue();
- if (values.contains(value) == false)
- values.add(valueSelector.copyValue());
- }
- else {
- if (values.contains(null) == false)
- values.add(null);
+ if (values.contains(value) == false) values.add(valueSelector.copyValue());
+ } else {
+ if (values.contains(null) == false) values.add(null);
}
}
@@ -113,8 +113,8 @@ public class DistinctValuesCollector<T, R> extends SecondPassGroupingCollector<T
}
/**
- * Returned by {@link DistinctValuesCollector#getGroups()},
- * representing the value and set of distinct values for the group.
+ * Returned by {@link DistinctValuesCollector#getGroups()}, representing the value and set of
+ * distinct values for the group.
*/
public static class GroupCount<T, R> {
@@ -126,5 +126,4 @@ public class DistinctValuesCollector<T, R> extends SecondPassGroupingCollector<T
this.uniqueValues = values;
}
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRange.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRange.java
index df34f6b..3ca4b8d 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRange.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRange.java
@@ -20,8 +20,7 @@ package org.apache.lucene.search.grouping;
import java.util.Objects;
/**
- * Represents a contiguous range of double values, with an inclusive minimum and
- * exclusive maximum
+ * Represents a contiguous range of double values, with an inclusive minimum and exclusive maximum
*/
public class DoubleRange {
@@ -30,9 +29,7 @@ public class DoubleRange {
/** The exclusive maximum value of this range */
public double max;
- /**
- * Creates a new double range, running from {@code min} inclusive to {@code max} exclusive
- */
+ /** Creates a new double range, running from {@code min} inclusive to {@code max} exclusive */
public DoubleRange(double min, double max) {
this.min = min;
this.max = max;
@@ -48,8 +45,7 @@ public class DoubleRange {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DoubleRange that = (DoubleRange) o;
- return Double.compare(that.min, min) == 0 &&
- Double.compare(that.max, max) == 0;
+ return Double.compare(that.min, min) == 0 && Double.compare(that.max, max) == 0;
}
@Override
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeFactory.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeFactory.java
index 3ea4606..6a4c957 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeFactory.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeFactory.java
@@ -17,9 +17,7 @@
package org.apache.lucene.search.grouping;
-/**
- * Groups double values into ranges
- */
+/** Groups double values into ranges */
public class DoubleRangeFactory {
private final double min;
@@ -28,11 +26,12 @@ public class DoubleRangeFactory {
/**
* Creates a new DoubleRangeFactory
- * @param min a minimum value; all doubles below this value are grouped into a single range
- * @param width a standard width; all ranges between {@code min} and {@code max} are this wide,
- * with the exception of the final range which may be up to this width. Ranges
- * are inclusive at the lower end, and exclusive at the upper end.
- * @param max a maximum value; all doubles above this value are grouped into a single range
+ *
+ * @param min a minimum value; all doubles below this value are grouped into a single range
+ * @param width a standard width; all ranges between {@code min} and {@code max} are this wide,
+ * with the exception of the final range which may be up to this width. Ranges are inclusive
+ * at the lower end, and exclusive at the upper end.
+ * @param max a maximum value; all doubles above this value are grouped into a single range
*/
public DoubleRangeFactory(double min, double width, double max) {
this.min = min;
@@ -42,12 +41,14 @@ public class DoubleRangeFactory {
/**
* Finds the DoubleRange that a value should be grouped into
+ *
* @param value the value to group
* @param reuse an existing DoubleRange object to reuse
*/
public DoubleRange getRange(double value, DoubleRange reuse) {
- if (reuse == null)
+ if (reuse == null) {
reuse = new DoubleRange(Double.MIN_VALUE, Double.MAX_VALUE);
+ }
if (value < min) {
reuse.max = min;
reuse.min = Double.MIN_VALUE;
@@ -63,5 +64,4 @@ public class DoubleRangeFactory {
reuse.max = reuse.min + width;
return reuse;
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeGroupSelector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeGroupSelector.java
index 4a6a65a..bacf9a6 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeGroupSelector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/DoubleRangeGroupSelector.java
@@ -21,15 +21,12 @@ import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.DoubleValues;
import org.apache.lucene.search.DoubleValuesSource;
import org.apache.lucene.search.Scorable;
-/**
- * A GroupSelector implementation that groups documents by double values
- */
+/** A GroupSelector implementation that groups documents by double values */
public class DoubleRangeGroupSelector extends GroupSelector<DoubleRange> {
private final DoubleValuesSource source;
@@ -45,8 +42,10 @@ public class DoubleRangeGroupSelector extends GroupSelector<DoubleRange> {
/**
* Creates a new DoubleRangeGroupSelector
- * @param source a DoubleValuesSource to retrieve double values per document
- * @param rangeFactory a DoubleRangeFactory that defines how to group the double values into range buckets
+ *
+ * @param source a DoubleValuesSource to retrieve double values per document
+ * @param rangeFactory a DoubleRangeFactory that defines how to group the double values into range
+ * buckets
*/
public DoubleRangeGroupSelector(DoubleValuesSource source, DoubleRangeFactory rangeFactory) {
this.source = source;
@@ -91,10 +90,11 @@ public class DoubleRangeGroupSelector extends GroupSelector<DoubleRange> {
inSecondPass = new HashSet<>();
includeEmpty = false;
for (SearchGroup<DoubleRange> group : searchGroups) {
- if (group.groupValue == null)
+ if (group.groupValue == null) {
includeEmpty = true;
- else
+ } else {
inSecondPass.add(group.groupValue);
+ }
}
}
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/FirstPassGroupingCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/FirstPassGroupingCollector.java
index f5b0597..6873eb3 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/FirstPassGroupingCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/FirstPassGroupingCollector.java
@@ -22,7 +22,6 @@ import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeSet;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.FieldComparator;
import org.apache.lucene.search.LeafFieldComparator;
@@ -32,12 +31,11 @@ import org.apache.lucene.search.SimpleCollector;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
-/** FirstPassGroupingCollector is the first of two passes necessary
- * to collect grouped hits. This pass gathers the top N sorted
- * groups. Groups are defined by a {@link GroupSelector}
+/**
+ * FirstPassGroupingCollector is the first of two passes necessary to collect grouped hits. This
+ * pass gathers the top N sorted groups. Groups are defined by a {@link GroupSelector}
*
- * <p>See {@link org.apache.lucene.search.grouping} for more
- * details including a full code example.</p>
+ * <p>See {@link org.apache.lucene.search.grouping} for more details including a full code example.
*
* @lucene.experimental
*/
@@ -56,6 +54,7 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
// Set once we reach topNGroups unique groups:
/** @lucene.internal */
protected TreeSet<CollectedSearchGroup<T>> orderedGroups;
+
private int docBase;
private int spareSlot;
@@ -63,16 +62,14 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
* Create the first pass collector.
*
* @param groupSelector a GroupSelector used to defined groups
- * @param groupSort The {@link Sort} used to sort the
- * groups. The top sorted document within each group
- * according to groupSort, determines how that group
- * sorts against other groups. This must be non-null,
- * ie, if you want to groupSort by relevance use
- * Sort.RELEVANCE.
+ * @param groupSort The {@link Sort} used to sort the groups. The top sorted document within each
+ * group according to groupSort, determines how that group sorts against other groups. This
+ * must be non-null, ie, if you want to groupSort by relevance use Sort.RELEVANCE.
* @param topNGroups How many top groups to keep.
*/
@SuppressWarnings({"unchecked", "rawtypes"})
- public FirstPassGroupingCollector(GroupSelector<T> groupSelector, Sort groupSort, int topNGroups) {
+ public FirstPassGroupingCollector(
+ GroupSelector<T> groupSelector, Sort groupSort, int topNGroups) {
this.groupSelector = groupSelector;
if (topNGroups < 1) {
throw new IllegalArgumentException("topNGroups must be >= 1 (got " + topNGroups + ")");
@@ -91,7 +88,8 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
for (int i = 0; i < sortFields.length; i++) {
final SortField sortField = sortFields[i];
- // use topNGroups + 1 so we have a spare slot to use for comparing (tracked by this.spareSlot):
+ // use topNGroups + 1 so we have a spare slot to use for comparing (tracked by
+ // this.spareSlot):
comparators[i] = sortField.getComparator(topNGroups + 1, i);
reversed[i] = sortField.getReverse() ? -1 : 1;
}
@@ -106,16 +104,16 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
}
/**
- * Returns top groups, starting from offset. This may
- * return null, if no groups were collected, or if the
- * number of unique groups collected is <= offset.
+ * Returns top groups, starting from offset. This may return null, if no groups were collected, or
+ * if the number of unique groups collected is <= offset.
*
* @param groupOffset The offset in the collected groups
* @return top groups, starting from offset
*/
public Collection<SearchGroup<T>> getTopGroups(int groupOffset) throws IOException {
- //System.out.println("FP.getTopGroups groupOffset=" + groupOffset + " fillFields=" + fillFields + " groupMap.size()=" + groupMap.size());
+ // System.out.println("FP.getTopGroups groupOffset=" + groupOffset + " fillFields=" + fillFields
+ // + " groupMap.size()=" + groupMap.size());
if (groupOffset < 0) {
throw new IllegalArgumentException("groupOffset must be >= 0 (got " + groupOffset + ")");
@@ -132,20 +130,22 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
final Collection<SearchGroup<T>> result = new ArrayList<>();
int upto = 0;
final int sortFieldCount = comparators.length;
- for(CollectedSearchGroup<T> group : orderedGroups) {
+ for (CollectedSearchGroup<T> group : orderedGroups) {
if (upto++ < groupOffset) {
continue;
}
- // System.out.println(" group=" + (group.groupValue == null ? "null" : group.groupValue.toString()));
+ // System.out.println(" group=" + (group.groupValue == null ? "null" :
+ // group.groupValue.toString()));
SearchGroup<T> searchGroup = new SearchGroup<>();
searchGroup.groupValue = group.groupValue;
searchGroup.sortValues = new Object[sortFieldCount];
- for(int sortFieldIDX=0;sortFieldIDX<sortFieldCount;sortFieldIDX++) {
- searchGroup.sortValues[sortFieldIDX] = comparators[sortFieldIDX].value(group.comparatorSlot);
+ for (int sortFieldIDX = 0; sortFieldIDX < sortFieldCount; sortFieldIDX++) {
+ searchGroup.sortValues[sortFieldIDX] =
+ comparators[sortFieldIDX].value(group.comparatorSlot);
}
result.add(searchGroup);
}
- //System.out.println(" return " + result.size() + " groups");
+ // System.out.println(" return " + result.size() + " groups");
return result;
}
@@ -168,7 +168,7 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
// Downside: if the number of unique groups is very low, this is
// wasted effort as we will most likely be updating an existing group.
if (orderedGroups != null) {
- for (int compIDX = 0;; compIDX++) {
+ for (int compIDX = 0; ; compIDX++) {
final int c = reversed[compIDX] * leafComparators[compIDX].compareBottom(doc);
if (c < 0) {
// Definitely not competitive. So don't even bother to continue
@@ -190,8 +190,9 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
@Override
public void collect(int doc) throws IOException {
- if (isCompetitive(doc) == false)
+ if (isCompetitive(doc) == false) {
return;
+ }
// TODO: should we add option to mean "ignore docs that
// don't have the group field" (instead of stuffing them
@@ -236,7 +237,7 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
// We already tested that the document is competitive, so replace
// the bottom group with this new group.
final CollectedSearchGroup<T> bottomGroup = orderedGroups.pollLast();
- assert orderedGroups.size() == topNGroups -1;
+ assert orderedGroups.size() == topNGroups - 1;
groupMap.remove(bottomGroup.groupValue);
@@ -261,16 +262,17 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
}
// Update existing group:
- for (int compIDX = 0;; compIDX++) {
+ for (int compIDX = 0; ; compIDX++) {
leafComparators[compIDX].copy(spareSlot, doc);
- final int c = reversed[compIDX] * comparators[compIDX].compare(group.comparatorSlot, spareSlot);
+ final int c =
+ reversed[compIDX] * comparators[compIDX].compare(group.comparatorSlot, spareSlot);
if (c < 0) {
// Definitely not competitive.
return;
} else if (c > 0) {
// Definitely competitive; set remaining comparators:
- for (int compIDX2=compIDX+1; compIDX2<comparators.length; compIDX2++) {
+ for (int compIDX2 = compIDX + 1; compIDX2 < comparators.length; compIDX2++) {
leafComparators[compIDX2].copy(spareSlot, doc);
}
break;
@@ -289,7 +291,7 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
if (orderedGroups != null) {
prevLast = orderedGroups.last();
orderedGroups.remove(group);
- assert orderedGroups.size() == topNGroups-1;
+ assert orderedGroups.size() == topNGroups - 1;
} else {
prevLast = null;
}
@@ -306,7 +308,8 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
orderedGroups.add(group);
assert orderedGroups.size() == topNGroups;
final CollectedSearchGroup<?> newLast = orderedGroups.last();
- // If we changed the value of the last group, or changed which group was last, then update bottom:
+ // If we changed the value of the last group, or changed which group was last, then update
+ // bottom:
if (group == newLast || prevLast != newLast) {
for (LeafFieldComparator fc : leafComparators) {
fc.setBottom(newLast.comparatorSlot);
@@ -316,20 +319,21 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
}
private void buildSortedSet() throws IOException {
- final Comparator<CollectedSearchGroup<?>> comparator = new Comparator<CollectedSearchGroup<?>>() {
- @Override
- public int compare(CollectedSearchGroup<?> o1, CollectedSearchGroup<?> o2) {
- for (int compIDX = 0;; compIDX++) {
- FieldComparator<?> fc = comparators[compIDX];
- final int c = reversed[compIDX] * fc.compare(o1.comparatorSlot, o2.comparatorSlot);
- if (c != 0) {
- return c;
- } else if (compIDX == compIDXEnd) {
- return o1.topDoc - o2.topDoc;
+ final Comparator<CollectedSearchGroup<?>> comparator =
+ new Comparator<CollectedSearchGroup<?>>() {
+ @Override
+ public int compare(CollectedSearchGroup<?> o1, CollectedSearchGroup<?> o2) {
+ for (int compIDX = 0; ; compIDX++) {
+ FieldComparator<?> fc = comparators[compIDX];
+ final int c = reversed[compIDX] * fc.compare(o1.comparatorSlot, o2.comparatorSlot);
+ if (c != 0) {
+ return c;
+ } else if (compIDX == compIDXEnd) {
+ return o1.topDoc - o2.topDoc;
+ }
+ }
}
- }
- }
- };
+ };
orderedGroups = new TreeSet<>(comparator);
orderedGroups.addAll(groupMap.values());
@@ -343,18 +347,14 @@ public class FirstPassGroupingCollector<T> extends SimpleCollector {
@Override
protected void doSetNextReader(LeafReaderContext readerContext) throws IOException {
docBase = readerContext.docBase;
- for (int i=0; i<comparators.length; i++) {
+ for (int i = 0; i < comparators.length; i++) {
leafComparators[i] = comparators[i].getLeafComparator(readerContext);
}
groupSelector.setNextReader(readerContext);
}
- /**
- * @return the GroupSelector used for this Collector
- */
+ /** @return the GroupSelector used for this Collector */
public GroupSelector<T> getGroupSelector() {
return groupSelector;
}
-
}
-
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupDocs.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupDocs.java
index 78861d0..9c0eccf 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupDocs.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupDocs.java
@@ -19,39 +19,43 @@ package org.apache.lucene.search.grouping;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TotalHits;
-/** Represents one group in the results.
- *
- * @lucene.experimental */
+/**
+ * Represents one group in the results.
+ *
+ * @lucene.experimental
+ */
public class GroupDocs<T> {
- /** The groupField value for all docs in this group; this
- * may be null if hits did not have the groupField. */
+ /**
+ * The groupField value for all docs in this group; this may be null if hits did not have the
+ * groupField.
+ */
public final T groupValue;
/** Max score in this group */
public final float maxScore;
- /** Overall aggregated score of this group (currently only
- * set by join queries). */
+ /** Overall aggregated score of this group (currently only set by join queries). */
public final float score;
- /** Hits; this may be {@link
- * org.apache.lucene.search.FieldDoc} instances if the
- * withinGroupSort sorted by fields. */
+ /**
+ * Hits; this may be {@link org.apache.lucene.search.FieldDoc} instances if the withinGroupSort
+ * sorted by fields.
+ */
public final ScoreDoc[] scoreDocs;
/** Total hits within this group */
public final TotalHits totalHits;
- /** Matches the groupSort passed to {@link
- * FirstPassGroupingCollector}. */
+ /** Matches the groupSort passed to {@link FirstPassGroupingCollector}. */
public final Object[] groupSortValues;
- public GroupDocs(float score,
- float maxScore,
- TotalHits totalHits,
- ScoreDoc[] scoreDocs,
- T groupValue,
- Object[] groupSortValues) {
+ public GroupDocs(
+ float score,
+ float maxScore,
+ TotalHits totalHits,
+ ScoreDoc[] scoreDocs,
+ T groupValue,
+ Object[] groupSortValues) {
this.score = score;
this.maxScore = maxScore;
this.totalHits = totalHits;
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupFacetCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupFacetCollector.java
index 5abd645..5dfc0d2 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupFacetCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupFacetCollector.java
@@ -23,7 +23,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.NavigableSet;
import java.util.TreeSet;
-
import org.apache.lucene.search.Scorable;
import org.apache.lucene.search.ScoreMode;
import org.apache.lucene.search.SimpleCollector;
@@ -55,17 +54,19 @@ public abstract class GroupFacetCollector extends SimpleCollector {
}
/**
- * Returns grouped facet results that were computed over zero or more segments.
- * Grouped facet counts are merged from zero or more segment results.
+ * Returns grouped facet results that were computed over zero or more segments. Grouped facet
+ * counts are merged from zero or more segment results.
*
* @param size The total number of facets to include. This is typically offset + limit
- * @param minCount The minimum count a facet entry should have to be included in the grouped facet result
- * @param orderByCount Whether to sort the facet entries by facet entry count. If <code>false</code> then the facets
- * are sorted lexicographically in ascending order.
+ * @param minCount The minimum count a facet entry should have to be included in the grouped facet
+ * result
+ * @param orderByCount Whether to sort the facet entries by facet entry count. If <code>false
+ * </code> then the facets are sorted lexicographically in ascending order.
* @return grouped facet results
* @throws IOException If I/O related errors occur during merging segment grouped facet counts.
*/
- public GroupedFacetResult mergeSegmentResults(int size, int minCount, boolean orderByCount) throws IOException {
+ public GroupedFacetResult mergeSegmentResults(int size, int minCount, boolean orderByCount)
+ throws IOException {
if (segmentFacetCounts != null) {
segmentResults.add(createSegmentResult());
segmentFacetCounts = null; // reset
@@ -83,7 +84,8 @@ public abstract class GroupFacetCollector extends SimpleCollector {
segments.add(segmentResult);
}
- GroupedFacetResult facetResult = new GroupedFacetResult(size, minCount, orderByCount, totalCount, missingCount);
+ GroupedFacetResult facetResult =
+ new GroupedFacetResult(size, minCount, orderByCount, totalCount, missingCount);
while (segments.size() > 0) {
SegmentResult segmentResult = segments.top();
BytesRef currentFacetValue = BytesRef.deepCopyOf(segmentResult.mergeTerm);
@@ -110,8 +112,7 @@ public abstract class GroupFacetCollector extends SimpleCollector {
protected abstract SegmentResult createSegmentResult() throws IOException;
@Override
- public void setScorer(Scorable scorer) throws IOException {
- }
+ public void setScorer(Scorable scorer) throws IOException {}
@Override
public ScoreMode scoreMode() {
@@ -119,31 +120,32 @@ public abstract class GroupFacetCollector extends SimpleCollector {
}
/**
- * The grouped facet result. Containing grouped facet entries, total count and total missing count.
+ * The grouped facet result. Containing grouped facet entries, total count and total missing
+ * count.
*/
public static class GroupedFacetResult {
- private final static Comparator<FacetEntry> orderByCountAndValue = new Comparator<FacetEntry>() {
-
- @Override
- public int compare(FacetEntry a, FacetEntry b) {
- int cmp = b.count - a.count; // Highest count first!
- if (cmp != 0) {
- return cmp;
- }
- return a.value.compareTo(b.value);
- }
+ private static final Comparator<FacetEntry> orderByCountAndValue =
+ new Comparator<FacetEntry>() {
- };
-
- private final static Comparator<FacetEntry> orderByValue = new Comparator<FacetEntry>() {
+ @Override
+ public int compare(FacetEntry a, FacetEntry b) {
+ int cmp = b.count - a.count; // Highest count first!
+ if (cmp != 0) {
+ return cmp;
+ }
+ return a.value.compareTo(b.value);
+ }
+ };
- @Override
- public int compare(FacetEntry a, FacetEntry b) {
- return a.value.compareTo(b.value);
- }
+ private static final Comparator<FacetEntry> orderByValue =
+ new Comparator<FacetEntry>() {
- };
+ @Override
+ public int compare(FacetEntry a, FacetEntry b) {
+ return a.value.compareTo(b.value);
+ }
+ };
private final int maxSize;
private final NavigableSet<FacetEntry> facetEntries;
@@ -152,7 +154,8 @@ public abstract class GroupFacetCollector extends SimpleCollector {
private int currentMin;
- public GroupedFacetResult(int size, int minCount, boolean orderByCount, int totalCount, int totalMissingCount) {
+ public GroupedFacetResult(
+ int size, int minCount, boolean orderByCount, int totalCount, int totalMissingCount) {
this.facetEntries = new TreeSet<>(orderByCount ? orderByCountAndValue : orderByValue);
this.totalMissingCount = totalMissingCount;
this.totalCount = totalCount;
@@ -180,8 +183,8 @@ public abstract class GroupFacetCollector extends SimpleCollector {
}
/**
- * Returns a list of facet entries to be rendered based on the specified offset and limit.
- * The facet entries are retrieved from the facet entries collected during merging.
+ * Returns a list of facet entries to be rendered based on the specified offset and limit. The
+ * facet entries are retrieved from the facet entries collected during merging.
*
* @param offset The offset in the collected facet entries during merging
* @param limit The number of facets to return starting from the offset.
@@ -224,9 +227,7 @@ public abstract class GroupFacetCollector extends SimpleCollector {
}
}
- /**
- * Represents a facet entry with a value and a count.
- */
+ /** Represents a facet entry with a value and a count. */
public static class FacetEntry {
private final BytesRef value;
@@ -259,30 +260,23 @@ public abstract class GroupFacetCollector extends SimpleCollector {
@Override
public String toString() {
- return "FacetEntry{" +
- "value=" + value.utf8ToString() +
- ", count=" + count +
- '}';
+ return "FacetEntry{" + "value=" + value.utf8ToString() + ", count=" + count + '}';
}
- /**
- * @return The value of this facet entry
- */
+ /** @return The value of this facet entry */
public BytesRef getValue() {
return value;
}
- /**
- * @return The count (number of groups) of this facet entry.
- */
+ /** @return The count (number of groups) of this facet entry. */
public int getCount() {
return count;
}
}
/**
- * Contains the local grouped segment counts for a particular segment.
- * Each <code>SegmentResult</code> must be added together.
+ * Contains the local grouped segment counts for a particular segment. Each <code>SegmentResult
+ * </code> must be added together.
*/
protected abstract static class SegmentResult {
@@ -302,12 +296,12 @@ public abstract class GroupFacetCollector extends SimpleCollector {
}
/**
- * Go to next term in this <code>SegmentResult</code> in order to retrieve the grouped facet counts.
+ * Go to next term in this <code>SegmentResult</code> in order to retrieve the grouped facet
+ * counts.
*
* @throws IOException If I/O related errors occur
*/
protected abstract void nextTerm() throws IOException;
-
}
private static class SegmentResultPriorityQueue extends PriorityQueue<SegmentResult> {
@@ -321,5 +315,4 @@ public abstract class GroupFacetCollector extends SimpleCollector {
return a.mergeTerm.compareTo(b.mergeTerm) < 0;
}
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupReducer.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupReducer.java
index d3fb1d9..313172a 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupReducer.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupReducer.java
@@ -21,22 +21,19 @@ import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.Collector;
import org.apache.lucene.search.LeafCollector;
import org.apache.lucene.search.Scorable;
/**
- * Concrete implementations of this class define what to collect for individual
- * groups during the second-pass of a grouping search.
+ * Concrete implementations of this class define what to collect for individual groups during the
+ * second-pass of a grouping search.
*
- * Each group is assigned a Collector returned by {@link #newCollector()}, and
- * {@link LeafCollector#collect(int)} is called for each document that is in
- * a group
+ * <p>Each group is assigned a Collector returned by {@link #newCollector()}, and {@link
+ * LeafCollector#collect(int)} is called for each document that is in a group
*
* @see SecondPassGroupingCollector
- *
* @param <T> the type of the value used for grouping
* @param <C> the type of {@link Collector} used to reduce each group
*/
@@ -47,7 +44,7 @@ public abstract class GroupReducer<T, C extends Collector> {
/**
* Define which groups should be reduced.
*
- * Called by {@link SecondPassGroupingCollector}
+ * <p>Called by {@link SecondPassGroupingCollector}
*/
public void setGroups(Collection<SearchGroup<T>> groups) {
for (SearchGroup<T> group : groups) {
@@ -55,25 +52,20 @@ public abstract class GroupReducer<T, C extends Collector> {
}
}
- /**
- * Whether or not this reducer requires collected documents to be scored
- */
+ /** Whether or not this reducer requires collected documents to be scored */
public abstract boolean needsScores();
- /**
- * Creates a new Collector for each group
- */
+ /** Creates a new Collector for each group */
protected abstract C newCollector();
- /**
- * Get the Collector for a given group
- */
+ /** Get the Collector for a given group */
public final C getCollector(T value) {
return groups.get(value).collector;
}
/**
* Collect a given document into a given group
+ *
* @throws IOException on error
*/
public final void collect(T value, int doc) throws IOException {
@@ -81,18 +73,14 @@ public abstract class GroupReducer<T, C extends Collector> {
collector.leafCollector.collect(doc);
}
- /**
- * Set the Scorer on all group collectors
- */
+ /** Set the Scorer on all group collectors */
public final void setScorer(Scorable scorer) throws IOException {
for (GroupCollector<C> collector : groups.values()) {
collector.leafCollector.setScorer(scorer);
}
}
- /**
- * Called when the parent {@link SecondPassGroupingCollector} moves to a new segment
- */
+ /** Called when the parent {@link SecondPassGroupingCollector} moves to a new segment */
public final void setNextReader(LeafReaderContext ctx) throws IOException {
for (GroupCollector<C> collector : groups.values()) {
collector.leafCollector = collector.collector.getLeafCollector(ctx);
@@ -108,5 +96,4 @@ public abstract class GroupReducer<T, C extends Collector> {
this.collector = collector;
}
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupSelector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupSelector.java
index 92962a4..a5e4ddc 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupSelector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupSelector.java
@@ -19,61 +19,52 @@ package org.apache.lucene.search.grouping;
import java.io.IOException;
import java.util.Collection;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.Scorable;
/**
* Defines a group, for use by grouping collectors
*
- * A GroupSelector acts as an iterator over documents. For each segment, clients
- * should call {@link #setNextReader(LeafReaderContext)}, and then {@link #advanceTo(int)}
- * for each matching document.
+ * <p>A GroupSelector acts as an iterator over documents. For each segment, clients should call
+ * {@link #setNextReader(LeafReaderContext)}, and then {@link #advanceTo(int)} for each matching
+ * document.
*
* @param <T> the type of the group value
*/
public abstract class GroupSelector<T> {
- /**
- * What to do with the current value
- */
- public enum State { SKIP, ACCEPT }
+ /** What to do with the current value */
+ public enum State {
+ SKIP,
+ ACCEPT
+ }
- /**
- * Set the LeafReaderContext
- */
+ /** Set the LeafReaderContext */
public abstract void setNextReader(LeafReaderContext readerContext) throws IOException;
- /**
- * Set the current Scorer
- */
+ /** Set the current Scorer */
public abstract void setScorer(Scorable scorer) throws IOException;
- /**
- * Advance the GroupSelector's iterator to the given document
- */
+ /** Advance the GroupSelector's iterator to the given document */
public abstract State advanceTo(int doc) throws IOException;
/**
* Get the group value of the current document
*
- * N.B. this object may be reused, for a persistent version use {@link #copyValue()}
+ * <p>N.B. this object may be reused, for a persistent version use {@link #copyValue()}
*/
public abstract T currentValue() throws IOException;
- /**
- * @return a copy of the group value of the current document
- */
+ /** @return a copy of the group value of the current document */
public abstract T copyValue() throws IOException;
/**
* Set a restriction on the group values returned by this selector
*
- * If the selector is positioned on a document whose group value is not contained
- * within this set, then {@link #advanceTo(int)} will return {@link State#SKIP}
+ * <p>If the selector is positioned on a document whose group value is not contained within this
+ * set, then {@link #advanceTo(int)} will return {@link State#SKIP}
*
* @param groups a set of {@link SearchGroup} objects to limit selections to
*/
public abstract void setGroups(Collection<SearchGroup<T>> groups);
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupingSearch.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupingSearch.java
index 25ed377..ce97e2a 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupingSearch.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/GroupingSearch.java
@@ -20,7 +20,6 @@ import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
-
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.CachingCollector;
import org.apache.lucene.search.Collector;
@@ -62,8 +61,9 @@ public class GroupingSearch {
private Bits matchingGroupHeads;
/**
- * Constructs a <code>GroupingSearch</code> instance that groups documents by index terms using DocValues.
- * The group field can only have one token per document. This means that the field must not be analysed.
+ * Constructs a <code>GroupingSearch</code> instance that groups documents by index terms using
+ * DocValues. The group field can only have one token per document. This means that the field must
+ * not be analysed.
*
* @param groupField The name of the field to group by.
*/
@@ -72,7 +72,9 @@ public class GroupingSearch {
}
/**
- * Constructs a <code>GroupingSearch</code> instance that groups documents using a {@link GroupSelector}
+ * Constructs a <code>GroupingSearch</code> instance that groups documents using a {@link
+ * GroupSelector}
+ *
* @param groupSelector a {@link GroupSelector} that defines groups for this GroupingSearch
*/
public GroupingSearch(GroupSelector<?> groupSelector) {
@@ -80,10 +82,10 @@ public class GroupingSearch {
}
/**
- * Constructs a <code>GroupingSearch</code> instance that groups documents by function using a {@link ValueSource}
- * instance.
+ * Constructs a <code>GroupingSearch</code> instance that groups documents by function using a
+ * {@link ValueSource} instance.
*
- * @param groupFunction The function to group by specified as {@link ValueSource}
+ * @param groupFunction The function to group by specified as {@link ValueSource}
* @param valueSourceContext The context of the specified groupFunction
*/
public GroupingSearch(ValueSource groupFunction, Map<Object, Object> valueSourceContext) {
@@ -91,8 +93,8 @@ public class GroupingSearch {
}
/**
- * Constructor for grouping documents by doc block.
- * This constructor can only be used when documents belonging in a group are indexed in one block.
+ * Constructor for grouping documents by doc block. This constructor can only be used when
+ * documents belonging in a group are indexed in one block.
*
* @param groupEndDocs The query that marks the last document in all doc blocks
*/
@@ -106,36 +108,44 @@ public class GroupingSearch {
}
/**
- * Executes a grouped search. Both the first pass and second pass are executed on the specified searcher.
+ * Executes a grouped search. Both the first pass and second pass are executed on the specified
+ * searcher.
*
- * @param searcher The {@link org.apache.lucene.search.IndexSearcher} instance to execute the grouped search on.
- * @param query The query to execute with the grouping
+ * @param searcher The {@link org.apache.lucene.search.IndexSearcher} instance to execute the
+ * grouped search on.
+ * @param query The query to execute with the grouping
* @param groupOffset The group offset
- * @param groupLimit The number of groups to return from the specified group offset
+ * @param groupLimit The number of groups to return from the specified group offset
* @return the grouped result as a {@link TopGroups} instance
* @throws IOException If any I/O related errors occur
*/
@SuppressWarnings("unchecked")
- public <T> TopGroups<T> search(IndexSearcher searcher, Query query, int groupOffset, int groupLimit) throws IOException {
+ public <T> TopGroups<T> search(
+ IndexSearcher searcher, Query query, int groupOffset, int groupLimit) throws IOException {
if (grouper != null) {
return groupByFieldOrFunction(searcher, query, groupOffset, groupLimit);
} else if (groupEndDocs != null) {
return (TopGroups<T>) groupByDocBlock(searcher, query, groupOffset, groupLimit);
} else {
- throw new IllegalStateException("Either groupField, groupFunction or groupEndDocs must be set."); // This can't happen...
+ throw new IllegalStateException(
+ "Either groupField, groupFunction or groupEndDocs must be set."); // This can't happen...
}
}
@SuppressWarnings({"unchecked", "rawtypes"})
- protected TopGroups groupByFieldOrFunction(IndexSearcher searcher, Query query, int groupOffset, int groupLimit) throws IOException {
+ protected TopGroups groupByFieldOrFunction(
+ IndexSearcher searcher, Query query, int groupOffset, int groupLimit) throws IOException {
int topN = groupOffset + groupLimit;
- final FirstPassGroupingCollector firstPassCollector = new FirstPassGroupingCollector(grouper, groupSort, topN);
- final AllGroupsCollector allGroupsCollector = allGroups ? new AllGroupsCollector(grouper) : null;
- final AllGroupHeadsCollector allGroupHeadsCollector
- = allGroupHeads ? AllGroupHeadsCollector.newCollector(grouper, sortWithinGroup) : null;
+ final FirstPassGroupingCollector firstPassCollector =
+ new FirstPassGroupingCollector(grouper, groupSort, topN);
+ final AllGroupsCollector allGroupsCollector =
+ allGroups ? new AllGroupsCollector(grouper) : null;
+ final AllGroupHeadsCollector allGroupHeadsCollector =
+ allGroupHeads ? AllGroupHeadsCollector.newCollector(grouper, sortWithinGroup) : null;
- final Collector firstRound = MultiCollector.wrap(firstPassCollector, allGroupsCollector, allGroupHeadsCollector);
+ final Collector firstRound =
+ MultiCollector.wrap(firstPassCollector, allGroupsCollector, allGroupHeadsCollector);
CachingCollector cachedCollector = null;
if (maxCacheRAMMB != null || maxDocsToCache != null) {
@@ -150,8 +160,10 @@ public class GroupingSearch {
}
matchingGroups = allGroups ? allGroupsCollector.getGroups() : Collections.emptyList();
- matchingGroupHeads = allGroupHeads ? allGroupHeadsCollector.retrieveGroupHeads(searcher.getIndexReader().maxDoc())
- : new Bits.MatchNoBits(searcher.getIndexReader().maxDoc());
+ matchingGroupHeads =
+ allGroupHeads
+ ? allGroupHeadsCollector.retrieveGroupHeads(searcher.getIndexReader().maxDoc())
+ : new Bits.MatchNoBits(searcher.getIndexReader().maxDoc());
Collection<SearchGroup> topSearchGroups = firstPassCollector.getTopGroups(groupOffset);
if (topSearchGroups == null) {
@@ -159,8 +171,9 @@ public class GroupingSearch {
}
int topNInsideGroup = groupDocsOffset + groupDocsLimit;
- TopGroupsCollector secondPassCollector
- = new TopGroupsCollector(grouper, topSearchGroups, groupSort, sortWithinGroup, topNInsideGroup, includeMaxScore);
+ TopGroupsCollector secondPassCollector =
+ new TopGroupsCollector(
+ grouper, topSearchGroups, groupSort, sortWithinGroup, topNInsideGroup, includeMaxScore);
if (cachedCollector != null && cachedCollector.isCached()) {
cachedCollector.replay(secondPassCollector);
@@ -169,29 +182,38 @@ public class GroupingSearch {
}
if (allGroups) {
- return new TopGroups(secondPassCollector.getTopGroups(groupDocsOffset), matchingGroups.size());
+ return new TopGroups(
+ secondPassCollector.getTopGroups(groupDocsOffset), matchingGroups.size());
} else {
return secondPassCollector.getTopGroups(groupDocsOffset);
}
}
- protected TopGroups<?> groupByDocBlock(IndexSearcher searcher, Query query, int groupOffset, int groupLimit) throws IOException {
+ protected TopGroups<?> groupByDocBlock(
+ IndexSearcher searcher, Query query, int groupOffset, int groupLimit) throws IOException {
int topN = groupOffset + groupLimit;
final Query endDocsQuery = searcher.rewrite(this.groupEndDocs);
- final Weight groupEndDocs = searcher.createWeight(endDocsQuery, ScoreMode.COMPLETE_NO_SCORES, 1);
- BlockGroupingCollector c = new BlockGroupingCollector(groupSort, topN, groupSort.needsScores() || sortWithinGroup.needsScores(), groupEndDocs);
+ final Weight groupEndDocs =
+ searcher.createWeight(endDocsQuery, ScoreMode.COMPLETE_NO_SCORES, 1);
+ BlockGroupingCollector c =
+ new BlockGroupingCollector(
+ groupSort,
+ topN,
+ groupSort.needsScores() || sortWithinGroup.needsScores(),
+ groupEndDocs);
searcher.search(query, c);
int topNInsideGroup = groupDocsOffset + groupDocsLimit;
return c.getTopGroups(sortWithinGroup, groupOffset, groupDocsOffset, topNInsideGroup);
}
/**
- * Enables caching for the second pass search. The cache will not grow over a specified limit in MB.
- * The cache is filled during the first pass searched and then replayed during the second pass searched.
- * If the cache grows beyond the specified limit, then the cache is purged and not used in the second pass search.
+ * Enables caching for the second pass search. The cache will not grow over a specified limit in
+ * MB. The cache is filled during the first pass searched and then replayed during the second pass
+ * searched. If the cache grows beyond the specified limit, then the cache is purged and not used
+ * in the second pass search.
*
* @param maxCacheRAMMB The maximum amount in MB the cache is allowed to hold
- * @param cacheScores Whether to cache the scores
+ * @param cacheScores Whether to cache the scores
* @return <code>this</code>
*/
public GroupingSearch setCachingInMB(double maxCacheRAMMB, boolean cacheScores) {
@@ -202,12 +224,13 @@ public class GroupingSearch {
}
/**
- * Enables caching for the second pass search. The cache will not contain more than the maximum specified documents.
- * The cache is filled during the first pass searched and then replayed during the second pass searched.
- * If the cache grows beyond the specified limit, then the cache is purged and not used in the second pass search.
+ * Enables caching for the second pass search. The cache will not contain more than the maximum
+ * specified documents. The cache is filled during the first pass searched and then replayed
+ * during the second pass searched. If the cache grows beyond the specified limit, then the cache
+ * is purged and not used in the second pass search.
*
* @param maxDocsToCache The maximum number of documents the cache is allowed to hold
- * @param cacheScores Whether to cache the scores
+ * @param cacheScores Whether to cache the scores
* @return <code>this</code>
*/
public GroupingSearch setCaching(int maxDocsToCache, boolean cacheScores) {
@@ -229,8 +252,7 @@ public class GroupingSearch {
}
/**
- * Specifies how groups are sorted.
- * Defaults to {@link Sort#RELEVANCE}.
+ * Specifies how groups are sorted. Defaults to {@link Sort#RELEVANCE}.
*
* @param groupSort The sort for the groups.
* @return <code>this</code>
@@ -241,8 +263,7 @@ public class GroupingSearch {
}
/**
- * Specified how documents inside a group are sorted.
- * Defaults to {@link Sort#RELEVANCE}.
+ * Specified how documents inside a group are sorted. Defaults to {@link Sort#RELEVANCE}.
*
* @param sortWithinGroup The sort for documents inside a group
* @return <code>this</code>
@@ -286,11 +307,11 @@ public class GroupingSearch {
}
/**
- * Whether to also compute all groups matching the query.
- * This can be used to determine the number of groups, which can be used for accurate pagination.
- * <p>
- * When grouping by doc block the number of groups are automatically included in the {@link TopGroups} and this
- * option doesn't have any influence.
+ * Whether to also compute all groups matching the query. This can be used to determine the number
+ * of groups, which can be used for accurate pagination.
+ *
+ * <p>When grouping by doc block the number of groups are automatically included in the {@link
+ * TopGroups} and this option doesn't have any influence.
*
* @param allGroups to also compute all groups matching the query
* @return <code>this</code>
@@ -301,11 +322,11 @@ public class GroupingSearch {
}
/**
- * If {@link #setAllGroups(boolean)} was set to <code>true</code> then all matching groups are returned, otherwise
- * an empty collection is returned.
+ * If {@link #setAllGroups(boolean)} was set to <code>true</code> then all matching groups are
+ * returned, otherwise an empty collection is returned.
*
- * @param <T> The group value type. This can be a {@link BytesRef} or a {@link MutableValue} instance. If grouping
- * by doc block this the group value is always <code>null</code>.
+ * @param <T> The group value type. This can be a {@link BytesRef} or a {@link MutableValue}
+ * instance. If grouping by doc block this the group value is always <code>null</code>.
* @return all matching groups are returned, or an empty collection
*/
@SuppressWarnings({"unchecked", "rawtypes"})
@@ -315,10 +336,11 @@ public class GroupingSearch {
/**
* Whether to compute all group heads (most relevant document per group) matching the query.
- * <p>
- * This feature isn't enabled when grouping by doc block.
*
- * @param allGroupHeads Whether to compute all group heads (most relevant document per group) matching the query
+ * <p>This feature isn't enabled when grouping by doc block.
+ *
+ * @param allGroupHeads Whether to compute all group heads (most relevant document per group)
+ * matching the query
* @return <code>this</code>
*/
public GroupingSearch setAllGroupHeads(boolean allGroupHeads) {
@@ -327,12 +349,13 @@ public class GroupingSearch {
}
/**
- * Returns the matching group heads if {@link #setAllGroupHeads(boolean)} was set to true or an empty bit set.
+ * Returns the matching group heads if {@link #setAllGroupHeads(boolean)} was set to true or an
+ * empty bit set.
*
- * @return The matching group heads if {@link #setAllGroupHeads(boolean)} was set to true or an empty bit set
+ * @return The matching group heads if {@link #setAllGroupHeads(boolean)} was set to true or an
+ * empty bit set
*/
public Bits getAllGroupHeads() {
return matchingGroupHeads;
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRange.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRange.java
index 7b6c845..9b631d1 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRange.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRange.java
@@ -19,10 +19,7 @@ package org.apache.lucene.search.grouping;
import java.util.Objects;
-/**
- * Represents a contiguous range of long values, with an inclusive minimum and
- * exclusive maximum
- */
+/** Represents a contiguous range of long values, with an inclusive minimum and exclusive maximum */
public class LongRange {
/** The inclusive minimum value of this range */
@@ -30,9 +27,7 @@ public class LongRange {
/** The exclusive maximum value of this range */
public long max;
- /**
- * Creates a new double range, running from {@code min} inclusive to {@code max} exclusive
- */
+ /** Creates a new double range, running from {@code min} inclusive to {@code max} exclusive */
public LongRange(long min, long max) {
this.min = min;
this.max = max;
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeFactory.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeFactory.java
index be66647..c2795d8 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeFactory.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeFactory.java
@@ -17,9 +17,7 @@
package org.apache.lucene.search.grouping;
-/**
- * Groups double values into ranges
- */
+/** Groups double values into ranges */
public class LongRangeFactory {
private final long min;
@@ -28,11 +26,12 @@ public class LongRangeFactory {
/**
* Creates a new LongRangeFactory
- * @param min a minimum value; all longs below this value are grouped into a single range
- * @param width a standard width; all ranges between {@code min} and {@code max} are this wide,
- * with the exception of the final range which may be up to this width. Ranges
- * are inclusive at the lower end, and exclusive at the upper end.
- * @param max a maximum value; all longs above this value are grouped into a single range
+ *
+ * @param min a minimum value; all longs below this value are grouped into a single range
+ * @param width a standard width; all ranges between {@code min} and {@code max} are this wide,
+ * with the exception of the final range which may be up to this width. Ranges are inclusive
+ * at the lower end, and exclusive at the upper end.
+ * @param max a maximum value; all longs above this value are grouped into a single range
*/
public LongRangeFactory(long min, long width, long max) {
this.min = min;
@@ -42,12 +41,14 @@ public class LongRangeFactory {
/**
* Finds the LongRange that a value should be grouped into
+ *
* @param value the value to group
* @param reuse an existing LongRange object to reuse
*/
public LongRange getRange(long value, LongRange reuse) {
- if (reuse == null)
+ if (reuse == null) {
reuse = new LongRange(Long.MIN_VALUE, Long.MAX_VALUE);
+ }
if (value < min) {
reuse.max = min;
reuse.min = Long.MIN_VALUE;
@@ -63,5 +64,4 @@ public class LongRangeFactory {
reuse.max = reuse.min + width;
return reuse;
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeGroupSelector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeGroupSelector.java
index 7dd0c23..ba8623d 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeGroupSelector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/LongRangeGroupSelector.java
@@ -21,16 +21,13 @@ import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.DoubleValuesSource;
import org.apache.lucene.search.LongValues;
import org.apache.lucene.search.LongValuesSource;
import org.apache.lucene.search.Scorable;
-/**
- * A GroupSelector implementation that groups documents by long values
- */
+/** A GroupSelector implementation that groups documents by long values */
public class LongRangeGroupSelector extends GroupSelector<LongRange> {
private final LongValuesSource source;
@@ -46,8 +43,10 @@ public class LongRangeGroupSelector extends GroupSelector<LongRange> {
/**
* Creates a new LongRangeGroupSelector
- * @param source a LongValuesSource to retrieve long values per document
- * @param rangeFactory a LongRangeFactory that defines how to group the long values into range buckets
+ *
+ * @param source a LongValuesSource to retrieve long values per document
+ * @param rangeFactory a LongRangeFactory that defines how to group the long values into range
+ * buckets
*/
public LongRangeGroupSelector(LongValuesSource source, LongRangeFactory rangeFactory) {
this.source = source;
@@ -92,10 +91,11 @@ public class LongRangeGroupSelector extends GroupSelector<LongRange> {
inSecondPass = new HashSet<>();
includeEmpty = false;
for (SearchGroup<LongRange> group : searchGroups) {
- if (group.groupValue == null)
+ if (group.groupValue == null) {
includeEmpty = true;
- else
+ } else {
inSecondPass.add(group.groupValue);
+ }
}
}
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/SearchGroup.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/SearchGroup.java
index 58e1f74..f859e47 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/SearchGroup.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/SearchGroup.java
@@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import java.util.NavigableSet;
import java.util.TreeSet;
-
import org.apache.lucene.search.FieldComparator;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
@@ -38,19 +37,23 @@ import org.apache.lucene.search.SortField;
*/
public class SearchGroup<T> {
- /** The value that defines this group */
+ /** The value that defines this group */
public T groupValue;
- /** The sort values used during sorting. These are the
- * groupSort field values of the highest rank document
- * (by the groupSort) within the group. Can be
- * <code>null</code> if <code>fillFields=false</code> had
- * been passed to {@link FirstPassGroupingCollector#getTopGroups} */
+ /**
+ * The sort values used during sorting. These are the groupSort field values of the highest rank
+ * document (by the groupSort) within the group. Can be <code>null</code> if <code>
+ * fillFields=false</code> had been passed to {@link FirstPassGroupingCollector#getTopGroups}
+ */
public Object[] sortValues;
@Override
public String toString() {
- return("SearchGroup(groupValue=" + groupValue + " sortValues=" + Arrays.toString(sortValues) + ")");
+ return ("SearchGroup(groupValue="
+ + groupValue
+ + " sortValues="
+ + Arrays.toString(sortValues)
+ + ")");
}
@Override
@@ -90,11 +93,12 @@ public class SearchGroup<T> {
assert iter.hasNext();
final SearchGroup<T> group = iter.next();
if (group.sortValues == null) {
- throw new IllegalArgumentException("group.sortValues is null; you must pass fillFields=true to the first pass collector");
+ throw new IllegalArgumentException(
+ "group.sortValues is null; you must pass fillFields=true to the first pass collector");
}
return group;
}
-
+
@Override
public String toString() {
return "ShardIter(shard=" + shardIndex + ")";
@@ -162,7 +166,7 @@ public class SearchGroup<T> {
@SuppressWarnings("rawtypes")
public final FieldComparator[] comparators;
-
+
public final int[] reversed;
@SuppressWarnings({"unchecked", "rawtypes"})
@@ -178,18 +182,19 @@ public class SearchGroup<T> {
}
@Override
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
public int compare(MergedGroup<T> group, MergedGroup<T> other) {
if (group == other) {
return 0;
}
- //System.out.println("compare group=" + group + " other=" + other);
+ // System.out.println("compare group=" + group + " other=" + other);
final Object[] groupValues = group.topValues;
final Object[] otherValues = other.topValues;
- //System.out.println(" groupValues=" + groupValues + " otherValues=" + otherValues);
- for (int compIDX = 0;compIDX < comparators.length; compIDX++) {
- final int c = reversed[compIDX] * comparators[compIDX].compareValues(groupValues[compIDX],
- otherValues[compIDX]);
+ // System.out.println(" groupValues=" + groupValues + " otherValues=" + otherValues);
+ for (int compIDX = 0; compIDX < comparators.length; compIDX++) {
+ final int c =
+ reversed[compIDX]
+ * comparators[compIDX].compareValues(groupValues[compIDX], otherValues[compIDX]);
if (c != 0) {
return c;
}
@@ -205,7 +210,7 @@ public class SearchGroup<T> {
private final GroupComparator<T> groupComp;
private final NavigableSet<MergedGroup<T>> queue;
- private final Map<T,MergedGroup<T>> groupsSeen;
+ private final Map<T, MergedGroup<T>> groupsSeen;
public GroupMerger(Sort groupSort) {
groupComp = new GroupComparator<>(groupSort);
@@ -213,17 +218,18 @@ public class SearchGroup<T> {
groupsSeen = new HashMap<>();
}
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
private void updateNextGroup(int topN, ShardIter<T> shard) {
- while(shard.iter.hasNext()) {
+ while (shard.iter.hasNext()) {
final SearchGroup<T> group = shard.next();
MergedGroup<T> mergedGroup = groupsSeen.get(group.groupValue);
final boolean isNew = mergedGroup == null;
- //System.out.println(" next group=" + (group.groupValue == null ? "null" : ((BytesRef) group.groupValue).utf8ToString()) + " sort=" + Arrays.toString(group.sortValues));
+ // System.out.println(" next group=" + (group.groupValue == null ? "null" : ((BytesRef)
+ // group.groupValue).utf8ToString()) + " sort=" + Arrays.toString(group.sortValues));
if (isNew) {
// Start a new group:
- //System.out.println(" new");
+ // System.out.println(" new");
mergedGroup = new MergedGroup<>(group.groupValue);
mergedGroup.minShardIndex = shard.shardIndex;
assert group.sortValues != null;
@@ -236,11 +242,13 @@ public class SearchGroup<T> {
// processed; move on to next group...
continue;
} else {
- //System.out.println(" old");
+ // System.out.println(" old");
boolean competes = false;
- for(int compIDX=0;compIDX<groupComp.comparators.length;compIDX++) {
- final int cmp = groupComp.reversed[compIDX] * groupComp.comparators[compIDX].compareValues(group.sortValues[compIDX],
- mergedGroup.topValues[compIDX]);
+ for (int compIDX = 0; compIDX < groupComp.comparators.length; compIDX++) {
+ final int cmp =
+ groupComp.reversed[compIDX]
+ * groupComp.comparators[compIDX].compareValues(
+ group.sortValues[compIDX], mergedGroup.topValues[compIDX]);
if (cmp < 0) {
// Definitely competes
competes = true;
@@ -248,14 +256,14 @@ public class SearchGroup<T> {
} else if (cmp > 0) {
// Definitely does not compete
break;
- } else if (compIDX == groupComp.comparators.length-1) {
+ } else if (compIDX == groupComp.comparators.length - 1) {
if (shard.shardIndex < mergedGroup.minShardIndex) {
competes = true;
}
}
}
- //System.out.println(" competes=" + competes);
+ // System.out.println(" competes=" + competes);
if (competes) {
// Group's sort changed -- remove & re-insert
@@ -274,23 +282,24 @@ public class SearchGroup<T> {
}
// Prune un-competitive groups:
- while(queue.size() > topN) {
+ while (queue.size() > topN) {
final MergedGroup<T> group = queue.pollLast();
- //System.out.println("PRUNE: " + group);
+ // System.out.println("PRUNE: " + group);
group.inQueue = false;
}
}
- public Collection<SearchGroup<T>> merge(List<Collection<SearchGroup<T>>> shards, int offset, int topN) {
+ public Collection<SearchGroup<T>> merge(
+ List<Collection<SearchGroup<T>>> shards, int offset, int topN) {
final int maxQueueSize = offset + topN;
- //System.out.println("merge");
+ // System.out.println("merge");
// Init queue:
- for(int shardIDX=0;shardIDX<shards.size();shardIDX++) {
+ for (int shardIDX = 0; shardIDX < shards.size(); shardIDX++) {
final Collection<SearchGroup<T>> shard = shards.get(shardIDX);
if (!shard.isEmpty()) {
- //System.out.println(" insert shard=" + shardIDX);
+ // System.out.println(" insert shard=" + shardIDX);
updateNextGroup(maxQueueSize, new ShardIter<>(shard, shardIDX));
}
}
@@ -300,10 +309,12 @@ public class SearchGroup<T> {
int count = 0;
- while(!queue.isEmpty()) {
+ while (!queue.isEmpty()) {
final MergedGroup<T> group = queue.pollFirst();
group.processed = true;
- //System.out.println(" pop: shards=" + group.shards + " group=" + (group.groupValue == null ? "null" : (((BytesRef) group.groupValue).utf8ToString())) + " sortValues=" + Arrays.toString(group.topValues));
+ // System.out.println(" pop: shards=" + group.shards + " group=" + (group.groupValue ==
+ // null ? "null" : (((BytesRef) group.groupValue).utf8ToString())) + " sortValues=" +
+ // Arrays.toString(group.topValues));
if (count++ >= offset) {
final SearchGroup<T> newGroup = new SearchGroup<>();
newGroup.groupValue = group.groupValue;
@@ -312,12 +323,12 @@ public class SearchGroup<T> {
if (newTopGroups.size() == topN) {
break;
}
- //} else {
- // System.out.println(" skip < offset");
+ // } else {
+ // System.out.println(" skip < offset");
}
// Advance all iters in this group:
- for(ShardIter<T> shardIter : group.shards) {
+ for (ShardIter<T> shardIter : group.shards) {
updateNextGroup(maxQueueSize, shardIter);
}
}
@@ -330,16 +341,16 @@ public class SearchGroup<T> {
}
}
- /** Merges multiple collections of top groups, for example
- * obtained from separate index shards. The provided
- * groupSort must match how the groups were sorted, and
- * the provided SearchGroups must have been computed
- * with fillFields=true passed to {@link
- * FirstPassGroupingCollector#getTopGroups}.
+ /**
+ * Merges multiple collections of top groups, for example obtained from separate index shards. The
+ * provided groupSort must match how the groups were sorted, and the provided SearchGroups must
+ * have been computed with fillFields=true passed to {@link
+ * FirstPassGroupingCollector#getTopGroups}.
*
* <p>NOTE: this returns null if the topGroups is empty.
*/
- public static <T> Collection<SearchGroup<T>> merge(List<Collection<SearchGroup<T>>> topGroups, int offset, int topN, Sort groupSort) {
+ public static <T> Collection<SearchGroup<T>> merge(
+ List<Collection<SearchGroup<T>>> topGroups, int offset, int topN, Sort groupSort) {
if (topGroups.isEmpty()) {
return null;
} else {
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/SecondPassGroupingCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/SecondPassGroupingCollector.java
index dc7d0aa..77cd049 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/SecondPassGroupingCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/SecondPassGroupingCollector.java
@@ -19,19 +19,17 @@ package org.apache.lucene.search.grouping;
import java.io.IOException;
import java.util.Collection;
import java.util.Objects;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.Scorable;
import org.apache.lucene.search.ScoreMode;
import org.apache.lucene.search.SimpleCollector;
/**
- * SecondPassGroupingCollector runs over an already collected set of
- * groups, further applying a {@link GroupReducer} to each group
+ * SecondPassGroupingCollector runs over an already collected set of groups, further applying a
+ * {@link GroupReducer} to each group
*
* @see TopGroupsCollector
* @see DistinctValuesCollector
- *
* @lucene.experimental
*/
public class SecondPassGroupingCollector<T> extends SimpleCollector {
@@ -45,13 +43,17 @@ public class SecondPassGroupingCollector<T> extends SimpleCollector {
/**
* Create a new SecondPassGroupingCollector
- * @param groupSelector the GroupSelector that defines groups for this search
- * @param groups the groups to collect documents for
- * @param reducer the reducer to apply to each group
+ *
+ * @param groupSelector the GroupSelector that defines groups for this search
+ * @param groups the groups to collect documents for
+ * @param reducer the reducer to apply to each group
*/
- public SecondPassGroupingCollector(GroupSelector<T> groupSelector, Collection<SearchGroup<T>> groups, GroupReducer<T, ?> reducer) {
+ public SecondPassGroupingCollector(
+ GroupSelector<T> groupSelector,
+ Collection<SearchGroup<T>> groups,
+ GroupReducer<T, ?> reducer) {
- //System.out.println("SP init");
+ // System.out.println("SP init");
if (groups.isEmpty()) {
throw new IllegalArgumentException("no groups to collect (groups is empty)");
}
@@ -64,9 +66,7 @@ public class SecondPassGroupingCollector<T> extends SimpleCollector {
reducer.setGroups(groups);
}
- /**
- * @return the GroupSelector used in this collector
- */
+ /** @return the GroupSelector used in this collector */
public GroupSelector<T> getGroupSelector() {
return groupSelector;
}
@@ -85,8 +85,9 @@ public class SecondPassGroupingCollector<T> extends SimpleCollector {
@Override
public void collect(int doc) throws IOException {
totalHitCount++;
- if (groupSelector.advanceTo(doc) == GroupSelector.State.SKIP)
+ if (groupSelector.advanceTo(doc) == GroupSelector.State.SKIP) {
return;
+ }
totalGroupedHitCount++;
T value = groupSelector.currentValue();
groupReducer.collect(value, doc);
@@ -97,5 +98,4 @@ public class SecondPassGroupingCollector<T> extends SimpleCollector {
groupReducer.setNextReader(readerContext);
groupSelector.setNextReader(readerContext);
}
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupFacetCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupFacetCollector.java
index 39d28a5..96c948d 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupFacetCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupFacetCollector.java
@@ -19,7 +19,6 @@ package org.apache.lucene.search.grouping;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.SortedDocValues;
@@ -31,8 +30,8 @@ import org.apache.lucene.util.SentinelIntSet;
import org.apache.lucene.util.UnicodeUtil;
/**
- * An implementation of {@link GroupFacetCollector} that computes grouped facets based on the indexed terms
- * from DocValues.
+ * An implementation of {@link GroupFacetCollector} that computes grouped facets based on the
+ * indexed terms from DocValues.
*
* @lucene.experimental
*/
@@ -44,23 +43,24 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
SortedDocValues groupFieldTermsIndex;
/**
- * Factory method for creating the right implementation based on the fact whether the facet field contains
- * multiple tokens per documents.
+ * Factory method for creating the right implementation based on the fact whether the facet field
+ * contains multiple tokens per documents.
*
* @param groupField The group field
* @param facetField The facet field
* @param facetFieldMultivalued Whether the facet field has multiple tokens per document
* @param facetPrefix The facet prefix a facet entry should start with to be included.
- * @param initialSize The initial allocation size of the internal int set and group facet list which should roughly
- * match the total number of expected unique groups. Be aware that the heap usage is
- * 4 bytes * initialSize.
+ * @param initialSize The initial allocation size of the internal int set and group facet list
+ * which should roughly match the total number of expected unique groups. Be aware that the
+ * heap usage is 4 bytes * initialSize.
* @return <code>TermGroupFacetCollector</code> implementation
*/
- public static TermGroupFacetCollector createTermGroupFacetCollector(String groupField,
- String facetField,
- boolean facetFieldMultivalued,
- BytesRef facetPrefix,
- int initialSize) {
+ public static TermGroupFacetCollector createTermGroupFacetCollector(
+ String groupField,
+ String facetField,
+ boolean facetFieldMultivalued,
+ BytesRef facetPrefix,
+ int initialSize) {
if (facetFieldMultivalued) {
return new MV(groupField, facetField, facetPrefix, initialSize);
} else {
@@ -68,7 +68,8 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
}
}
- TermGroupFacetCollector(String groupField, String facetField, BytesRef facetPrefix, int initialSize) {
+ TermGroupFacetCollector(
+ String groupField, String facetField, BytesRef facetPrefix, int initialSize) {
super(groupField, facetField, facetPrefix);
groupedFacetHits = new ArrayList<>(initialSize);
segmentGroupedFacetHits = new SentinelIntSet(initialSize, Integer.MIN_VALUE);
@@ -95,7 +96,7 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
} else {
facetOrd = -1;
}
-
+
if (facetOrd < startFacetOrd || facetOrd >= endFacetOrd) {
return;
}
@@ -110,13 +111,14 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
} else {
groupOrd = -1;
}
- int segmentGroupedFacetsIndex = groupOrd * (facetFieldTermsIndex.getValueCount()+1) + facetOrd;
+ int segmentGroupedFacetsIndex =
+ groupOrd * (facetFieldTermsIndex.getValueCount() + 1) + facetOrd;
if (segmentGroupedFacetHits.exists(segmentGroupedFacetsIndex)) {
return;
}
segmentTotalCount++;
- segmentFacetCounts[facetOrd+1]++;
+ segmentFacetCounts[facetOrd + 1]++;
segmentGroupedFacetHits.put(segmentGroupedFacetsIndex);
@@ -147,22 +149,29 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
facetFieldTermsIndex = DocValues.getSorted(context.reader(), facetField);
// 1+ to allow for the -1 "not set":
- segmentFacetCounts = new int[facetFieldTermsIndex.getValueCount()+1];
+ segmentFacetCounts = new int[facetFieldTermsIndex.getValueCount() + 1];
segmentTotalCount = 0;
segmentGroupedFacetHits.clear();
for (GroupedFacetHit groupedFacetHit : groupedFacetHits) {
- int facetOrd = groupedFacetHit.facetValue == null ? -1 : facetFieldTermsIndex.lookupTerm(groupedFacetHit.facetValue);
+ int facetOrd =
+ groupedFacetHit.facetValue == null
+ ? -1
+ : facetFieldTermsIndex.lookupTerm(groupedFacetHit.facetValue);
if (groupedFacetHit.facetValue != null && facetOrd < 0) {
continue;
}
- int groupOrd = groupedFacetHit.groupValue == null ? -1 : groupFieldTermsIndex.lookupTerm(groupedFacetHit.groupValue);
+ int groupOrd =
+ groupedFacetHit.groupValue == null
+ ? -1
+ : groupFieldTermsIndex.lookupTerm(groupedFacetHit.groupValue);
if (groupedFacetHit.groupValue != null && groupOrd < 0) {
continue;
}
- int segmentGroupedFacetsIndex = groupOrd * (facetFieldTermsIndex.getValueCount()+1) + facetOrd;
+ int segmentGroupedFacetsIndex =
+ groupOrd * (facetFieldTermsIndex.getValueCount() + 1) + facetOrd;
segmentGroupedFacetHits.put(segmentGroupedFacetsIndex);
}
@@ -186,17 +195,23 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
@Override
protected SegmentResult createSegmentResult() throws IOException {
- return new SegmentResult(segmentFacetCounts, segmentTotalCount, facetFieldTermsIndex.termsEnum(), startFacetOrd, endFacetOrd);
+ return new SegmentResult(
+ segmentFacetCounts,
+ segmentTotalCount,
+ facetFieldTermsIndex.termsEnum(),
+ startFacetOrd,
+ endFacetOrd);
}
private static class SegmentResult extends GroupFacetCollector.SegmentResult {
final TermsEnum tenum;
- SegmentResult(int[] counts, int total, TermsEnum tenum, int startFacetOrd, int endFacetOrd) throws IOException {
- super(counts, total - counts[0], counts[0], endFacetOrd+1);
+ SegmentResult(int[] counts, int total, TermsEnum tenum, int startFacetOrd, int endFacetOrd)
+ throws IOException {
+ super(counts, total - counts[0], counts[0], endFacetOrd + 1);
this.tenum = tenum;
- this.mergePos = startFacetOrd == -1 ? 1 : startFacetOrd+1;
+ this.mergePos = startFacetOrd == -1 ? 1 : startFacetOrd + 1;
if (mergePos < maxTermPos) {
assert tenum != null;
tenum.seekExact(startFacetOrd == -1 ? 0 : startFacetOrd);
@@ -234,7 +249,7 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
} else {
groupOrd = -1;
}
-
+
if (facetFieldNumTerms == 0) {
int segmentGroupedFacetsIndex = groupOrd * (facetFieldNumTerms + 1);
if (facetPrefix != null || segmentGroupedFacetHits.exists(segmentGroupedFacetsIndex)) {
@@ -266,12 +281,14 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
empty = false;
}
}
-
+
if (empty) {
- process(groupOrd, facetFieldNumTerms); // this facet ord is reserved for docs not containing facet field.
+ process(
+ groupOrd,
+ facetFieldNumTerms); // this facet ord is reserved for docs not containing facet field.
}
}
-
+
private void process(int groupOrd, int facetOrd) throws IOException {
if (facetOrd < startFacetOrd || facetOrd >= endFacetOrd) {
return;
@@ -317,20 +334,25 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
} else {
facetOrdTermsEnum = facetFieldDocTermOrds.termsEnum();
}
- // [facetFieldNumTerms() + 1] for all possible facet values and docs not containing facet field
+ // [facetFieldNumTerms() + 1] for all possible facet values and docs not containing facet
+ // field
segmentFacetCounts = new int[facetFieldNumTerms + 1];
segmentTotalCount = 0;
segmentGroupedFacetHits.clear();
for (GroupedFacetHit groupedFacetHit : groupedFacetHits) {
- int groupOrd = groupedFacetHit.groupValue == null ? -1 : groupFieldTermsIndex.lookupTerm(groupedFacetHit.groupValue);
+ int groupOrd =
+ groupedFacetHit.groupValue == null
+ ? -1
+ : groupFieldTermsIndex.lookupTerm(groupedFacetHit.groupValue);
if (groupedFacetHit.groupValue != null && groupOrd < 0) {
continue;
}
int facetOrd;
if (groupedFacetHit.facetValue != null) {
- if (facetOrdTermsEnum == null || !facetOrdTermsEnum.seekExact(groupedFacetHit.facetValue)) {
+ if (facetOrdTermsEnum == null
+ || !facetOrdTermsEnum.seekExact(groupedFacetHit.facetValue)) {
continue;
}
facetOrd = (int) facetOrdTermsEnum.ord();
@@ -338,7 +360,8 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
facetOrd = facetFieldNumTerms;
}
- // (facetFieldDocTermOrds.numTerms() + 1) for all possible facet values and docs not containing facet field
+ // (facetFieldDocTermOrds.numTerms() + 1) for all possible facet values and docs not
+ // containing facet field
int segmentGroupedFacetsIndex = groupOrd * (facetFieldNumTerms + 1) + facetOrd;
segmentGroupedFacetHits.put(segmentGroupedFacetsIndex);
}
@@ -376,16 +399,32 @@ public abstract class TermGroupFacetCollector extends GroupFacetCollector {
@Override
protected SegmentResult createSegmentResult() throws IOException {
- return new SegmentResult(segmentFacetCounts, segmentTotalCount, facetFieldNumTerms, facetOrdTermsEnum, startFacetOrd, endFacetOrd);
+ return new SegmentResult(
+ segmentFacetCounts,
+ segmentTotalCount,
+ facetFieldNumTerms,
+ facetOrdTermsEnum,
+ startFacetOrd,
+ endFacetOrd);
}
private static class SegmentResult extends GroupFacetCollector.SegmentResult {
final TermsEnum tenum;
- SegmentResult(int[] counts, int total, int missingCountIndex, TermsEnum tenum, int startFacetOrd, int endFacetOrd) throws IOException {
- super(counts, total - counts[missingCountIndex], counts[missingCountIndex],
- endFacetOrd == missingCountIndex + 1 ? missingCountIndex : endFacetOrd);
+ SegmentResult(
+ int[] counts,
+ int total,
+ int missingCountIndex,
+ TermsEnum tenum,
+ int startFacetOrd,
+ int endFacetOrd)
+ throws IOException {
+ super(
+ counts,
+ total - counts[missingCountIndex],
+ counts[missingCountIndex],
+ endFacetOrd == missingCountIndex + 1 ? missingCountIndex : endFacetOrd);
this.tenum = tenum;
this.mergePos = startFacetOrd;
if (tenum != null) {
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupSelector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupSelector.java
index 65213b2..802776e 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupSelector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TermGroupSelector.java
@@ -21,7 +21,6 @@ import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.SortedDocValues;
@@ -29,9 +28,7 @@ import org.apache.lucene.search.Scorable;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.BytesRefHash;
-/**
- * A GroupSelector implementation that groups via SortedDocValues
- */
+/** A GroupSelector implementation that groups via SortedDocValues */
public class TermGroupSelector extends GroupSelector<BytesRef> {
private final String field;
@@ -46,6 +43,7 @@ public class TermGroupSelector extends GroupSelector<BytesRef> {
/**
* Create a new TermGroupSelector
+ *
* @param field the SortedDocValues field to use for grouping
*/
public TermGroupSelector(String field) {
@@ -60,13 +58,14 @@ public class TermGroupSelector extends GroupSelector<BytesRef> {
for (int i = 0; i < values.size(); i++) {
values.get(i, scratch);
int ord = this.docValues.lookupTerm(scratch);
- if (ord >= 0)
+ if (ord >= 0) {
ordsToGroupIds.put(ord, i);
+ }
}
}
@Override
- public void setScorer(Scorable scorer) throws IOException { }
+ public void setScorer(Scorable scorer) throws IOException {}
@Override
public State advanceTo(int doc) throws IOException {
@@ -79,8 +78,9 @@ public class TermGroupSelector extends GroupSelector<BytesRef> {
groupId = ordsToGroupIds.get(ord);
return State.ACCEPT;
}
- if (secondPass)
+ if (secondPass) {
return State.SKIP;
+ }
groupId = values.add(docValues.binaryValue());
ordsToGroupIds.put(ord, groupId);
return State.ACCEPT;
@@ -90,16 +90,18 @@ public class TermGroupSelector extends GroupSelector<BytesRef> {
@Override
public BytesRef currentValue() {
- if (groupId == -1)
+ if (groupId == -1) {
return null;
+ }
values.get(groupId, scratch);
return scratch;
}
@Override
public BytesRef copyValue() {
- if (groupId == -1)
+ if (groupId == -1) {
return null;
+ }
return BytesRef.deepCopyOf(currentValue());
}
@@ -108,10 +110,11 @@ public class TermGroupSelector extends GroupSelector<BytesRef> {
this.values.clear();
this.values.reinit();
for (SearchGroup<BytesRef> sg : searchGroups) {
- if (sg.groupValue == null)
+ if (sg.groupValue == null) {
includeEmpty = true;
- else
+ } else {
this.values.add(sg.groupValue);
+ }
}
this.secondPass = true;
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
index b14e675..3ceb388 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
@@ -24,9 +24,11 @@ import org.apache.lucene.search.TopFieldDocs;
import org.apache.lucene.search.TotalHits;
import org.apache.lucene.search.TotalHits.Relation;
-/** Represents result returned by a grouping search.
+/**
+ * Represents result returned by a grouping search.
*
- * @lucene.experimental */
+ * @lucene.experimental
+ */
public class TopGroups<T> {
/** Number of documents matching the search */
public final int totalHitCount;
@@ -46,11 +48,16 @@ public class TopGroups<T> {
/** How docs are sorted within each group */
public final SortField[] withinGroupSort;
- /** Highest score across all hits, or
- * <code>Float.NaN</code> if scores were not computed. */
+ /** Highest score across all hits, or <code>Float.NaN</code> if scores were not computed. */
public final float maxScore;
- public TopGroups(SortField[] groupSort, SortField[] withinGroupSort, int totalHitCount, int totalGroupedHitCount, GroupDocs<T>[] groups, float maxScore) {
+ public TopGroups(
+ SortField[] groupSort,
+ SortField[] withinGroupSort,
+ int totalHitCount,
+ int totalGroupedHitCount,
+ GroupDocs<T>[] groups,
+ float maxScore) {
this.groupSort = groupSort;
this.withinGroupSort = withinGroupSort;
this.totalHitCount = totalHitCount;
@@ -73,7 +80,7 @@ public class TopGroups<T> {
/** How the GroupDocs score (if any) should be merged. */
public enum ScoreMergeMode {
/** Set score to Float.NaN */
- None,
+ None,
/* Sum score across all shards for this group. */
Total,
/* Avg score across all shards for this group. */
@@ -81,8 +88,9 @@ public class TopGroups<T> {
}
/**
- * If either value is NaN then return the other value, otherwise
- * return the greater of the two values by calling Math.max.
+ * If either value is NaN then return the other value, otherwise return the greater of the two
+ * values by calling Math.max.
+ *
* @param a - one value
* @param b - another value
* @return ignoring any NaN return the greater of a and b
@@ -93,26 +101,27 @@ public class TopGroups<T> {
return Math.max(a, b);
}
- /** Merges an array of TopGroups, for example obtained
- * from the second-pass collector across multiple
- * shards. Each TopGroups must have been sorted by the
- * same groupSort and docSort, and the top groups passed
- * to all second-pass collectors must be the same.
+ /**
+ * Merges an array of TopGroups, for example obtained from the second-pass collector across
+ * multiple shards. Each TopGroups must have been sorted by the same groupSort and docSort, and
+ * the top groups passed to all second-pass collectors must be the same.
*
- * <b>NOTE</b>: We can't always compute an exact totalGroupCount.
- * Documents belonging to a group may occur on more than
- * one shard and thus the merged totalGroupCount can be
- * higher than the actual totalGroupCount. In this case the
- * totalGroupCount represents a upper bound. If the documents
- * of one group do only reside in one shard then the
- * totalGroupCount is exact.
+ * <p><b>NOTE</b>: We can't always compute an exact totalGroupCount. Documents belonging to a
+ * group may occur on more than one shard and thus the merged totalGroupCount can be higher than
+ * the actual totalGroupCount. In this case the totalGroupCount represents a upper bound. If the
+ * documents of one group do only reside in one shard then the totalGroupCount is exact.
*
- * <b>NOTE</b>: the topDocs in each GroupDocs is actually
- * an instance of TopDocsAndShards
+ * <p><b>NOTE</b>: the topDocs in each GroupDocs is actually an instance of TopDocsAndShards
*/
- public static <T> TopGroups<T> merge(TopGroups<T>[] shardGroups, Sort groupSort, Sort docSort, int docOffset, int docTopN, ScoreMergeMode scoreMergeMode) {
+ public static <T> TopGroups<T> merge(
+ TopGroups<T>[] shardGroups,
+ Sort groupSort,
+ Sort docSort,
+ int docOffset,
+ int docTopN,
+ ScoreMergeMode scoreMergeMode) {
- //System.out.println("TopGroups.merge");
+ // System.out.println("TopGroups.merge");
if (shardGroups.length == 0) {
return null;
@@ -124,9 +133,10 @@ public class TopGroups<T> {
Integer totalGroupCount = null;
final int numGroups = shardGroups[0].groups.length;
- for(TopGroups<T> shard : shardGroups) {
+ for (TopGroups<T> shard : shardGroups) {
if (numGroups != shard.groups.length) {
- throw new IllegalArgumentException("number of groups differs across shards; you must pass same top groups to all shards' second-pass collector");
+ throw new IllegalArgumentException(
+ "number of groups differs across shards; you must pass same top groups to all shards' second-pass collector");
}
totalHitCount += shard.totalHitCount;
totalGroupedHitCount += shard.totalGroupedHitCount;
@@ -139,7 +149,7 @@ public class TopGroups<T> {
}
}
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
final GroupDocs<T>[] mergedGroupDocs = new GroupDocs[numGroups];
final TopDocs[] shardTopDocs;
@@ -150,22 +160,25 @@ public class TopGroups<T> {
}
float totalMaxScore = Float.NaN;
- for(int groupIDX=0;groupIDX<numGroups;groupIDX++) {
+ for (int groupIDX = 0; groupIDX < numGroups; groupIDX++) {
final T groupValue = shardGroups[0].groups[groupIDX].groupValue;
- //System.out.println(" merge groupValue=" + groupValue + " sortValues=" + Arrays.toString(shardGroups[0].groups[groupIDX].groupSortValues));
+ // System.out.println(" merge groupValue=" + groupValue + " sortValues=" +
+ // Arrays.toString(shardGroups[0].groups[groupIDX].groupSortValues));
float maxScore = Float.NaN;
int totalHits = 0;
double scoreSum = 0.0;
- for(int shardIDX=0;shardIDX<shardGroups.length;shardIDX++) {
- //System.out.println(" shard=" + shardIDX);
+ for (int shardIDX = 0; shardIDX < shardGroups.length; shardIDX++) {
+ // System.out.println(" shard=" + shardIDX);
final TopGroups<T> shard = shardGroups[shardIDX];
final GroupDocs<?> shardGroupDocs = shard.groups[groupIDX];
if (groupValue == null) {
if (shardGroupDocs.groupValue != null) {
- throw new IllegalArgumentException("group values differ across shards; you must pass same top groups to all shards' second-pass collector");
+ throw new IllegalArgumentException(
+ "group values differ across shards; you must pass same top groups to all shards' second-pass collector");
}
} else if (!groupValue.equals(shardGroupDocs.groupValue)) {
- throw new IllegalArgumentException("group values differ across shards; you must pass same top groups to all shards' second-pass collector");
+ throw new IllegalArgumentException(
+ "group values differ across shards; you must pass same top groups to all shards' second-pass collector");
}
/*
@@ -175,19 +188,18 @@ public class TopGroups<T> {
*/
if (docSort.equals(Sort.RELEVANCE)) {
- shardTopDocs[shardIDX] = new TopDocs(shardGroupDocs.totalHits,
- shardGroupDocs.scoreDocs);
+ shardTopDocs[shardIDX] = new TopDocs(shardGroupDocs.totalHits, shardGroupDocs.scoreDocs);
} else {
- shardTopDocs[shardIDX] = new TopFieldDocs(shardGroupDocs.totalHits,
- shardGroupDocs.scoreDocs,
- docSort.getSort());
+ shardTopDocs[shardIDX] =
+ new TopFieldDocs(
+ shardGroupDocs.totalHits, shardGroupDocs.scoreDocs, docSort.getSort());
}
for (int i = 0; i < shardTopDocs[shardIDX].scoreDocs.length; i++) {
shardTopDocs[shardIDX].scoreDocs[i].shardIndex = shardIDX;
}
- maxScore = nonNANmax(maxScore, shardGroupDocs.maxScore);
+ maxScore = nonNANmax(maxScore, shardGroupDocs.maxScore);
assert shardGroupDocs.totalHits.relation == Relation.EQUAL_TO;
totalHits += shardGroupDocs.totalHits.value;
scoreSum += shardGroupDocs.score;
@@ -208,57 +220,63 @@ public class TopGroups<T> {
mergedScoreDocs = new ScoreDoc[0];
} else {
mergedScoreDocs = new ScoreDoc[mergedTopDocs.scoreDocs.length - docOffset];
- System.arraycopy(mergedTopDocs.scoreDocs,
- docOffset,
- mergedScoreDocs,
- 0,
- mergedTopDocs.scoreDocs.length - docOffset);
+ System.arraycopy(
+ mergedTopDocs.scoreDocs,
+ docOffset,
+ mergedScoreDocs,
+ 0,
+ mergedTopDocs.scoreDocs.length - docOffset);
}
final float groupScore;
- switch(scoreMergeMode) {
- case None:
- groupScore = Float.NaN;
- break;
- case Avg:
- if (totalHits > 0) {
- groupScore = (float) (scoreSum / totalHits);
- } else {
+ switch (scoreMergeMode) {
+ case None:
groupScore = Float.NaN;
- }
- break;
- case Total:
- groupScore = (float) scoreSum;
- break;
- default:
- throw new IllegalArgumentException("can't handle ScoreMergeMode " + scoreMergeMode);
+ break;
+ case Avg:
+ if (totalHits > 0) {
+ groupScore = (float) (scoreSum / totalHits);
+ } else {
+ groupScore = Float.NaN;
+ }
+ break;
+ case Total:
+ groupScore = (float) scoreSum;
+ break;
+ default:
+ throw new IllegalArgumentException("can't handle ScoreMergeMode " + scoreMergeMode);
}
-
- //System.out.println("SHARDS=" + Arrays.toString(mergedTopDocs.shardIndex));
- mergedGroupDocs[groupIDX] = new GroupDocs<>(groupScore,
- maxScore,
- new TotalHits(totalHits, TotalHits.Relation.EQUAL_TO),
- mergedScoreDocs,
- groupValue,
- shardGroups[0].groups[groupIDX].groupSortValues);
+
+ // System.out.println("SHARDS=" + Arrays.toString(mergedTopDocs.shardIndex));
+ mergedGroupDocs[groupIDX] =
+ new GroupDocs<>(
+ groupScore,
+ maxScore,
+ new TotalHits(totalHits, TotalHits.Relation.EQUAL_TO),
+ mergedScoreDocs,
+ groupValue,
+ shardGroups[0].groups[groupIDX].groupSortValues);
totalMaxScore = nonNANmax(totalMaxScore, maxScore);
}
if (totalGroupCount != null) {
- TopGroups<T> result = new TopGroups<>(groupSort.getSort(),
- docSort.getSort(),
- totalHitCount,
- totalGroupedHitCount,
- mergedGroupDocs,
- totalMaxScore);
+ TopGroups<T> result =
+ new TopGroups<>(
+ groupSort.getSort(),
+ docSort.getSort(),
+ totalHitCount,
+ totalGroupedHitCount,
+ mergedGroupDocs,
+ totalMaxScore);
return new TopGroups<>(result, totalGroupCount);
} else {
- return new TopGroups<>(groupSort.getSort(),
- docSort.getSort(),
- totalHitCount,
- totalGroupedHitCount,
- mergedGroupDocs,
- totalMaxScore);
+ return new TopGroups<>(
+ groupSort.getSort(),
+ docSort.getSort(),
+ totalHitCount,
+ totalGroupedHitCount,
+ mergedGroupDocs,
+ totalMaxScore);
}
}
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroupsCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroupsCollector.java
index 01e9928..b3cbb25 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroupsCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroupsCollector.java
@@ -21,7 +21,6 @@ import java.io.IOException;
import java.util.Collection;
import java.util.Objects;
import java.util.function.Supplier;
-
import org.apache.lucene.search.FilterCollector;
import org.apache.lucene.search.MultiCollector;
import org.apache.lucene.search.Scorable;
@@ -36,8 +35,8 @@ import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.util.ArrayUtil;
/**
- * A second-pass collector that collects the TopDocs for each group, and
- * returns them as a {@link TopGroups} object
+ * A second-pass collector that collects the TopDocs for each group, and returns them as a {@link
+ * TopGroups} object
*
* @param <T> the type of the group value
*/
@@ -49,21 +48,28 @@ public class TopGroupsCollector<T> extends SecondPassGroupingCollector<T> {
/**
* Create a new TopGroupsCollector
- * @param groupSelector the group selector used to define groups
- * @param groups the groups to collect TopDocs for
- * @param groupSort the order in which groups are returned
- * @param withinGroupSort the order in which documents are sorted in each group
- * @param maxDocsPerGroup the maximum number of docs to collect for each group
- * @param getMaxScores if true, record the maximum score for each group
+ *
+ * @param groupSelector the group selector used to define groups
+ * @param groups the groups to collect TopDocs for
+ * @param groupSort the order in which groups are returned
+ * @param withinGroupSort the order in which documents are sorted in each group
+ * @param maxDocsPerGroup the maximum number of docs to collect for each group
+ * @param getMaxScores if true, record the maximum score for each group
*/
- public TopGroupsCollector(GroupSelector<T> groupSelector, Collection<SearchGroup<T>> groups, Sort groupSort, Sort withinGroupSort,
- int maxDocsPerGroup, boolean getMaxScores) {
- super(groupSelector, groups,
+ public TopGroupsCollector(
+ GroupSelector<T> groupSelector,
+ Collection<SearchGroup<T>> groups,
+ Sort groupSort,
+ Sort withinGroupSort,
+ int maxDocsPerGroup,
+ boolean getMaxScores) {
+ super(
+ groupSelector,
+ groups,
new TopDocsReducer<>(withinGroupSort, maxDocsPerGroup, getMaxScores));
this.groupSort = Objects.requireNonNull(groupSort);
this.withinGroupSort = Objects.requireNonNull(withinGroupSort);
this.maxDocsPerGroup = maxDocsPerGroup;
-
}
private static class MaxScoreCollector extends SimpleCollector {
@@ -98,8 +104,11 @@ public class TopGroupsCollector<T> extends SecondPassGroupingCollector<T> {
private final TopDocsCollector<?> topDocsCollector;
private final MaxScoreCollector maxScoreCollector;
private final boolean sortedByScore;
-
- public TopDocsAndMaxScoreCollector(boolean sortedByScore, TopDocsCollector<?> topDocsCollector, MaxScoreCollector maxScoreCollector) {
+
+ public TopDocsAndMaxScoreCollector(
+ boolean sortedByScore,
+ TopDocsCollector<?> topDocsCollector,
+ MaxScoreCollector maxScoreCollector) {
super(MultiCollector.wrap(topDocsCollector, maxScoreCollector));
this.sortedByScore = sortedByScore;
this.topDocsCollector = topDocsCollector;
@@ -112,17 +121,24 @@ public class TopGroupsCollector<T> extends SecondPassGroupingCollector<T> {
private final Supplier<TopDocsAndMaxScoreCollector> supplier;
private final boolean needsScores;
- TopDocsReducer(Sort withinGroupSort,
- int maxDocsPerGroup, boolean getMaxScores) {
+ TopDocsReducer(Sort withinGroupSort, int maxDocsPerGroup, boolean getMaxScores) {
this.needsScores = getMaxScores || withinGroupSort.needsScores();
if (withinGroupSort == Sort.RELEVANCE) {
- supplier = () -> new TopDocsAndMaxScoreCollector(true, TopScoreDocCollector.create(maxDocsPerGroup, Integer.MAX_VALUE), null);
+ supplier =
+ () ->
+ new TopDocsAndMaxScoreCollector(
+ true, TopScoreDocCollector.create(maxDocsPerGroup, Integer.MAX_VALUE), null);
} else {
- supplier = () -> {
- TopFieldCollector topDocsCollector = TopFieldCollector.create(withinGroupSort, maxDocsPerGroup, Integer.MAX_VALUE); // TODO: disable exact counts?
- MaxScoreCollector maxScoreCollector = getMaxScores ? new MaxScoreCollector() : null;
- return new TopDocsAndMaxScoreCollector(false, topDocsCollector, maxScoreCollector);
- };
+ supplier =
+ () -> {
+ TopFieldCollector topDocsCollector =
+ TopFieldCollector.create(
+ withinGroupSort,
+ maxDocsPerGroup,
+ Integer.MAX_VALUE); // TODO: disable exact counts?
+ MaxScoreCollector maxScoreCollector = getMaxScores ? new MaxScoreCollector() : null;
+ return new TopDocsAndMaxScoreCollector(false, topDocsCollector, maxScoreCollector);
+ };
}
}
@@ -139,25 +155,34 @@ public class TopGroupsCollector<T> extends SecondPassGroupingCollector<T> {
/**
* Get the TopGroups recorded by this collector
+ *
* @param withinGroupOffset the offset within each group to start collecting documents
*/
public TopGroups<T> getTopGroups(int withinGroupOffset) {
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
final GroupDocs<T>[] groupDocsResult = (GroupDocs<T>[]) new GroupDocs[groups.size()];
int groupIDX = 0;
float maxScore = Float.MIN_VALUE;
- for(SearchGroup<T> group : groups) {
- TopDocsAndMaxScoreCollector collector = (TopDocsAndMaxScoreCollector) groupReducer.getCollector(group.groupValue);
+ for (SearchGroup<T> group : groups) {
+ TopDocsAndMaxScoreCollector collector =
+ (TopDocsAndMaxScoreCollector) groupReducer.getCollector(group.groupValue);
final TopDocs topDocs;
final float groupMaxScore;
if (collector.sortedByScore) {
TopDocs allTopDocs = collector.topDocsCollector.topDocs();
- groupMaxScore = allTopDocs.scoreDocs.length == 0 ? Float.NaN : allTopDocs.scoreDocs[0].score;
+ groupMaxScore =
+ allTopDocs.scoreDocs.length == 0 ? Float.NaN : allTopDocs.scoreDocs[0].score;
if (allTopDocs.scoreDocs.length <= withinGroupOffset) {
topDocs = new TopDocs(allTopDocs.totalHits, new ScoreDoc[0]);
} else {
- topDocs = new TopDocs(allTopDocs.totalHits, ArrayUtil.copyOfSubArray(allTopDocs.scoreDocs, withinGroupOffset, Math.min(allTopDocs.scoreDocs.length, withinGroupOffset + maxDocsPerGroup)));
+ topDocs =
+ new TopDocs(
+ allTopDocs.totalHits,
+ ArrayUtil.copyOfSubArray(
+ allTopDocs.scoreDocs,
+ withinGroupOffset,
+ Math.min(allTopDocs.scoreDocs.length, withinGroupOffset + maxDocsPerGroup)));
}
} else {
topDocs = collector.topDocsCollector.topDocs(withinGroupOffset, maxDocsPerGroup);
@@ -167,21 +192,24 @@ public class TopGroupsCollector<T> extends SecondPassGroupingCollector<T> {
groupMaxScore = collector.maxScoreCollector.getMaxScore();
}
}
-
- groupDocsResult[groupIDX++] = new GroupDocs<>(Float.NaN,
- groupMaxScore,
- topDocs.totalHits,
- topDocs.scoreDocs,
- group.groupValue,
- group.sortValues);
+
+ groupDocsResult[groupIDX++] =
+ new GroupDocs<>(
+ Float.NaN,
+ groupMaxScore,
+ topDocs.totalHits,
+ topDocs.scoreDocs,
+ group.groupValue,
+ group.sortValues);
maxScore = Math.max(maxScore, groupMaxScore);
}
- return new TopGroups<>(groupSort.getSort(),
+ return new TopGroups<>(
+ groupSort.getSort(),
withinGroupSort.getSort(),
- totalHitCount, totalGroupedHitCount, groupDocsResult,
+ totalHitCount,
+ totalGroupedHitCount,
+ groupDocsResult,
maxScore);
}
-
-
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/ValueSourceGroupSelector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/ValueSourceGroupSelector.java
index 54373de..63e95d8 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/ValueSourceGroupSelector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/ValueSourceGroupSelector.java
@@ -22,16 +22,13 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.Scorable;
import org.apache.lucene.util.mutable.MutableValue;
-/**
- * A GroupSelector that groups via a ValueSource
- */
+/** A GroupSelector that groups via a ValueSource */
public class ValueSourceGroupSelector extends GroupSelector<MutableValue> {
private final ValueSource valueSource;
@@ -41,8 +38,9 @@ public class ValueSourceGroupSelector extends GroupSelector<MutableValue> {
/**
* Create a new ValueSourceGroupSelector
+ *
* @param valueSource the ValueSource to group by
- * @param context a context map for the ValueSource
+ * @param context a context map for the ValueSource
*/
public ValueSourceGroupSelector(ValueSource valueSource, Map<Object, Object> context) {
this.valueSource = valueSource;
@@ -58,14 +56,15 @@ public class ValueSourceGroupSelector extends GroupSelector<MutableValue> {
}
@Override
- public void setScorer(Scorable scorer) throws IOException { }
+ public void setScorer(Scorable scorer) throws IOException {}
@Override
public State advanceTo(int doc) throws IOException {
this.filler.fillValue(doc);
if (secondPassGroups != null) {
- if (secondPassGroups.contains(filler.getValue()) == false)
+ if (secondPassGroups.contains(filler.getValue()) == false) {
return State.SKIP;
+ }
}
return State.ACCEPT;
}
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/package-info.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/package-info.java
index 36d94a5..5c1b124 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/package-info.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/package-info.java
@@ -15,143 +15,125 @@
* limitations under the License.
*/
-/**
+/**
* Grouping.
- * <p>
- * This module enables search result grouping with Lucene, where hits
- * with the same value in the specified single-valued group field are
- * grouped together. For example, if you group by the <code>author</code>
- * field, then all documents with the same value in the <code>author</code>
- * field fall into a single group.
- * </p>
- *
- * <p>Grouping requires a number of inputs:</p>
- *
+ *
+ * <p>This module enables search result grouping with Lucene, where hits with the same value in the
+ * specified single-valued group field are grouped together. For example, if you group by the <code>
+ * author</code> field, then all documents with the same value in the <code>author</code> field fall
+ * into a single group.
+ *
+ * <p>Grouping requires a number of inputs:
+ *
* <ul>
- * <li><code>groupSelector</code>: this defines how groups are created
- * from values per-document. The grouping module ships with
- * selectors for grouping by term, and by long and double ranges.
- *
- * <li><code>groupSort</code>: how the groups are sorted. For sorting
- * purposes, each group is "represented" by the highest-sorted
- * document according to the <code>groupSort</code> within it. For
- * example, if you specify "price" (ascending) then the first group
- * is the one with the lowest price book within it. Or if you
- * specify relevance group sort, then the first group is the one
- * containing the highest scoring book.
- *
- * <li><code>topNGroups</code>: how many top groups to keep. For
- * example, 10 means the top 10 groups are computed.
- *
- * <li><code>groupOffset</code>: which "slice" of top groups you want to
- * retrieve. For example, 3 means you'll get 7 groups back
- * (assuming <code>topNGroups</code> is 10). This is useful for
+ * <li><code>groupSelector</code>: this defines how groups are created from values per-document.
+ * The grouping module ships with selectors for grouping by term, and by long and double
+ * ranges.
+ * <li><code>groupSort</code>: how the groups are sorted. For sorting purposes, each group is
+ * "represented" by the highest-sorted document according to the <code>groupSort</code> within
+ * it. For example, if you specify "price" (ascending) then the first group is the one with
+ * the lowest price book within it. Or if you specify relevance group sort, then the first
+ * group is the one containing the highest scoring book.
+ * <li><code>topNGroups</code>: how many top groups to keep. For example, 10 means the top 10
+ * groups are computed.
+ * <li><code>groupOffset</code>: which "slice" of top groups you want to retrieve. For example, 3
+ * means you'll get 7 groups back (assuming <code>topNGroups</code> is 10). This is useful for
* paging, where you might show 5 groups per page.
- *
- * <li><code>withinGroupSort</code>: how the documents within each group
- * are sorted. This can be different from the group sort.
- *
- * <li><code>maxDocsPerGroup</code>: how many top documents within each
- * group to keep.
- *
- * <li><code>withinGroupOffset</code>: which "slice" of top
- * documents you want to retrieve from each group.
- *
+ * <li><code>withinGroupSort</code>: how the documents within each group are sorted. This can be
+ * different from the group sort.
+ * <li><code>maxDocsPerGroup</code>: how many top documents within each group to keep.
+ * <li><code>withinGroupOffset</code>: which "slice" of top documents you want to retrieve from
+ * each group.
* </ul>
- *
+ *
* <p>The implementation is two-pass: the first pass ({@link
- * org.apache.lucene.search.grouping.FirstPassGroupingCollector})
- * gathers the top groups, and the second pass ({@link
- * org.apache.lucene.search.grouping.SecondPassGroupingCollector})
- * gathers documents within those groups. If the search is costly to
- * run you may want to use the {@link
- * org.apache.lucene.search.CachingCollector} class, which
- * caches hits and can (quickly) replay them for the second pass. This
- * way you only run the query once, but you pay a RAM cost to (briefly)
- * hold all hits. Results are returned as a {@link
- * org.apache.lucene.search.grouping.TopGroups} instance.</p>
- *
- * <p>Groups are defined by {@link org.apache.lucene.search.grouping.GroupSelector}
- * implementations:</p>
- * <ul>
- * <li>{@link org.apache.lucene.search.grouping.TermGroupSelector} groups based on
- * the value of a {@link org.apache.lucene.index.SortedDocValues} field</li>
- * <li>{@link org.apache.lucene.search.grouping.ValueSourceGroupSelector} groups based on
- * the value of a {@link org.apache.lucene.queries.function.ValueSource}</li>
- * <li>{@link org.apache.lucene.search.grouping.DoubleRangeGroupSelector} groups based on
- * the value of a {@link org.apache.lucene.search.DoubleValuesSource}</li>
- * <li>{@link org.apache.lucene.search.grouping.LongRangeGroupSelector} groups based on
- * the value of a {@link org.apache.lucene.search.LongValuesSource}</li>
- * </ul>
- *
- * <p>Known limitations:</p>
+ * org.apache.lucene.search.grouping.FirstPassGroupingCollector}) gathers the top groups, and the
+ * second pass ({@link org.apache.lucene.search.grouping.SecondPassGroupingCollector}) gathers
+ * documents within those groups. If the search is costly to run you may want to use the {@link
+ * org.apache.lucene.search.CachingCollector} class, which caches hits and can (quickly) replay them
+ * for the second pass. This way you only run the query once, but you pay a RAM cost to (briefly)
+ * hold all hits. Results are returned as a {@link org.apache.lucene.search.grouping.TopGroups}
+ * instance.
+ *
+ * <p>Groups are defined by {@link org.apache.lucene.search.grouping.GroupSelector} implementations:
+ *
* <ul>
- * <li> Sharding is not directly supported, though is not too
- * difficult, if you can merge the top groups and top documents per
- * group yourself.
+ * <li>{@link org.apache.lucene.search.grouping.TermGroupSelector} groups based on the value of a
+ * {@link org.apache.lucene.index.SortedDocValues} field
+ * <li>{@link org.apache.lucene.search.grouping.ValueSourceGroupSelector} groups based on the
+ * value of a {@link org.apache.lucene.queries.function.ValueSource}
+ * <li>{@link org.apache.lucene.search.grouping.DoubleRangeGroupSelector} groups based on the
+ * value of a {@link org.apache.lucene.search.DoubleValuesSource}
+ * <li>{@link org.apache.lucene.search.grouping.LongRangeGroupSelector} groups based on the value
+ * of a {@link org.apache.lucene.search.LongValuesSource}
* </ul>
- *
- * <p>Typical usage for the generic two-pass grouping search looks like this using the grouping convenience utility
- * (optionally using caching for the second pass search):</p>
- *
+ *
+ * <p>Known limitations:
+ *
+ * <ul>
+ * <li>Sharding is not directly supported, though is not too difficult, if you can merge the top
+ * groups and top documents per group yourself.
+ * </ul>
+ *
+ * <p>Typical usage for the generic two-pass grouping search looks like this using the grouping
+ * convenience utility (optionally using caching for the second pass search):
+ *
* <pre class="prettyprint">
* GroupingSearch groupingSearch = new GroupingSearch("author");
* groupingSearch.setGroupSort(groupSort);
* groupingSearch.setFillSortFields(fillFields);
- *
+ *
* if (useCache) {
* // Sets cache in MB
* groupingSearch.setCachingInMB(4.0, true);
* }
- *
+ *
* if (requiredTotalGroupCount) {
* groupingSearch.setAllGroups(true);
* }
- *
+ *
* TermQuery query = new TermQuery(new Term("content", searchTerm));
* TopGroups<BytesRef> result = groupingSearch.search(indexSearcher, query, groupOffset, groupLimit);
- *
+ *
* // Render groupsResult...
* if (requiredTotalGroupCount) {
* int totalGroupCount = result.totalGroupCount;
* }
* </pre>
- *
- * <p>To use the single-pass <code>BlockGroupingCollector</code>,
- * first, at indexing time, you must ensure all docs in each group
- * are added as a block, and you have some way to find the last
- * document of each group. One simple way to do this is to add a
- * marker binary field:</p>
- *
+ *
+ * <p>To use the single-pass <code>BlockGroupingCollector</code>, first, at indexing time, you must
+ * ensure all docs in each group are added as a block, and you have some way to find the last
+ * document of each group. One simple way to do this is to add a marker binary field:
+ *
* <pre class="prettyprint">
* // Create Documents from your source:
* List<Document> oneGroup = ...;
- *
+ *
* Field groupEndField = new Field("groupEnd", "x", Field.Store.NO, Field.Index.NOT_ANALYZED);
* groupEndField.setIndexOptions(IndexOptions.DOCS_ONLY);
* groupEndField.setOmitNorms(true);
* oneGroup.get(oneGroup.size()-1).add(groupEndField);
- *
+ *
* // You can also use writer.updateDocuments(); just be sure you
* // replace an entire previous doc block with this new one. For
* // example, each group could have a "groupID" field, with the same
* // value for all docs in this group:
* writer.addDocuments(oneGroup);
* </pre>
- *
+ *
* Then, at search time:
- *
+ *
* <pre class="prettyprint">
* Query groupEndDocs = new TermQuery(new Term("groupEnd", "x"));
* BlockGroupingCollector c = new BlockGroupingCollector(groupSort, groupOffset+topNGroups, needsScores, groupEndDocs);
* s.search(new TermQuery(new Term("content", searchTerm)), c);
* TopGroups groupsResult = c.getTopGroups(withinGroupSort, groupOffset, docOffset, docOffset+docsPerGroup, fillFields);
- *
+ *
* // Render groupsResult...
* </pre>
- *
+ *
* Or alternatively use the <code>GroupingSearch</code> convenience utility:
- *
+ *
* <pre class="prettyprint">
* // Per search:
* GroupingSearch groupingSearch = new GroupingSearch(groupEndDocs);
@@ -162,18 +144,18 @@
*
* // Render groupsResult...
* </pre>
- *
- * Note that the <code>groupValue</code> of each <code>GroupDocs</code>
- * will be <code>null</code>, so if you need to present this value you'll
- * have to separately retrieve it (for example using stored
- * fields, <code>FieldCache</code>, etc.).
- *
- * <p>Another collector is the <code>AllGroupHeadsCollector</code> that can be used to retrieve all most relevant
- * documents per group. Also known as group heads. This can be useful in situations when one wants to compute group
- * based facets / statistics on the complete query result. The collector can be executed during the first or second
- * phase. This collector can also be used with the <code>GroupingSearch</code> convenience utility, but when if one only
- * wants to compute the most relevant documents per group it is better to just use the collector as done here below.</p>
- *
+ *
+ * Note that the <code>groupValue</code> of each <code>GroupDocs</code> will be <code>null</code>,
+ * so if you need to present this value you'll have to separately retrieve it (for example using
+ * stored fields, <code>FieldCache</code>, etc.).
+ *
+ * <p>Another collector is the <code>AllGroupHeadsCollector</code> that can be used to retrieve all
+ * most relevant documents per group. Also known as group heads. This can be useful in situations
+ * when one wants to compute group based facets / statistics on the complete query result. The
+ * collector can be executed during the first or second phase. This collector can also be used with
+ * the <code>GroupingSearch</code> convenience utility, but when if one only wants to compute the
+ * most relevant documents per group it is better to just use the collector as done here below.
+ *
* <pre class="prettyprint">
* TermGroupSelector grouper = new TermGroupSelector(groupField);
* AllGroupHeadsCollector c = AllGroupHeadsCollector.newCollector(grouper, sortWithinGroup);
@@ -184,6 +166,5 @@
* int maxDoc = s.maxDoc();
* FixedBitSet groupHeadsBitSet = c.retrieveGroupHeads(maxDoc)
* </pre>
- *
*/
package org.apache.lucene.search.grouping;
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java
index e256667..0156acb 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java
@@ -18,7 +18,6 @@ package org.apache.lucene.search.grouping;
import java.io.Closeable;
import java.io.IOException;
-
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.search.IndexSearcher;
@@ -28,10 +27,9 @@ import org.apache.lucene.util.IOUtils;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.TestUtil;
-/**
- * Base class for grouping related tests.
- */
-// TODO (MvG) : The grouping tests contain a lot of code duplication. Try to move the common code to this class..
+/** Base class for grouping related tests. */
+// TODO (MvG) : The grouping tests contain a lot of code duplication. Try to move the common code to
+// this class..
public abstract class AbstractGroupingTestCase extends LuceneTestCase {
protected String generateRandomNonEmptyString() {
@@ -41,7 +39,7 @@ public abstract class AbstractGroupingTestCase extends LuceneTestCase {
// For that reason we don't generate empty string
// groups.
randomValue = TestUtil.randomRealisticUnicodeString(random());
- //randomValue = _TestUtil.randomSimpleString(random());
+ // randomValue = _TestUtil.randomSimpleString(random());
} while ("".equals(randomValue));
return randomValue;
}
@@ -62,8 +60,11 @@ public abstract class AbstractGroupingTestCase extends LuceneTestCase {
Shard() throws IOException {
this.directory = newDirectory();
- this.writer = new RandomIndexWriter(random(), directory,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+ this.writer =
+ new RandomIndexWriter(
+ random(),
+ directory,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
}
IndexSearcher getIndexSearcher() throws IOException {
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/BaseGroupSelectorTestCase.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/BaseGroupSelectorTestCase.java
index bb2a946..d3e84af 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/BaseGroupSelectorTestCase.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/BaseGroupSelectorTestCase.java
@@ -21,7 +21,6 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericDocValuesField;
@@ -54,7 +53,7 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
Shard shard = new Shard();
indexRandomDocs(shard.writer);
- String[] query = new String[]{ "foo", "bar", "baz" };
+ String[] query = new String[] {"foo", "bar", "baz"};
Query topLevel = new TermQuery(new Term("text", query[random().nextInt(query.length)]));
IndexSearcher searcher = shard.getIndexSearcher();
@@ -65,10 +64,11 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
for (int i = 0; i < topGroups.groups.length; i++) {
// Each group should have a result set equal to that returned by the top-level query,
// filtered by the group value.
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(filterQuery(topGroups.groups[i].groupValue), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(filterQuery(topGroups.groups[i].groupValue), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 10);
assertScoreDocsEquals(topGroups.groups[i].scoreDocs, td.scoreDocs);
if (i == 0) {
@@ -86,12 +86,15 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
indexRandomDocs(shard.writer);
IndexSearcher searcher = shard.getIndexSearcher();
- String[] query = new String[]{ "foo", "bar", "baz" };
+ String[] query = new String[] {"foo", "bar", "baz"};
Query topLevel = new TermQuery(new Term("text", query[random().nextInt(query.length)]));
GroupingSearch grouper = new GroupingSearch(getGroupSelector());
grouper.setGroupDocsLimit(10);
- Sort sort = new Sort(new SortField("sort1", SortField.Type.STRING), new SortField("sort2", SortField.Type.LONG));
+ Sort sort =
+ new Sort(
+ new SortField("sort1", SortField.Type.STRING),
+ new SortField("sort2", SortField.Type.LONG));
grouper.setGroupSort(sort);
TopGroups<T> topGroups = grouper.search(searcher, topLevel, 0, 5);
TopDocs topDoc = searcher.search(topLevel, 1, sort);
@@ -99,10 +102,11 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
// We're sorting the groups by a defined Sort, but each group itself should be ordered
// by doc relevance, and should be equal to the results of a top-level query filtered
// by the group value
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(filterQuery(topGroups.groups[i].groupValue), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(filterQuery(topGroups.groups[i].groupValue), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 10);
assertScoreDocsEquals(topGroups.groups[i].scoreDocs, td.scoreDocs);
// The top group should have sort values equal to the sort values of the top doc of
@@ -111,7 +115,8 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
if (i > 0) {
assertSortsBefore(topGroups.groups[i - 1], topGroups.groups[i]);
} else {
- assertArrayEquals(((FieldDoc)topDoc.scoreDocs[0]).fields, topGroups.groups[0].groupSortValues);
+ assertArrayEquals(
+ ((FieldDoc) topDoc.scoreDocs[0]).fields, topGroups.groups[0].groupSortValues);
}
}
@@ -124,12 +129,15 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
indexRandomDocs(shard.writer);
IndexSearcher searcher = shard.getIndexSearcher();
- String[] query = new String[]{ "foo", "bar", "baz" };
+ String[] query = new String[] {"foo", "bar", "baz"};
Query topLevel = new TermQuery(new Term("text", query[random().nextInt(query.length)]));
GroupingSearch grouper = new GroupingSearch(getGroupSelector());
grouper.setGroupDocsLimit(10);
- Sort sort = new Sort(new SortField("sort1", SortField.Type.STRING), new SortField("sort2", SortField.Type.LONG));
+ Sort sort =
+ new Sort(
+ new SortField("sort1", SortField.Type.STRING),
+ new SortField("sort2", SortField.Type.LONG));
grouper.setSortWithinGroup(sort);
TopGroups<T> topGroups = grouper.search(searcher, topLevel, 0, 5);
@@ -146,16 +154,16 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
}
// Groups themselves are ordered by a defined Sort, and each should give the same result as
// the top-level query, filtered by the group value, with the same Sort
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(filterQuery(topGroups.groups[i].groupValue), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(filterQuery(topGroups.groups[i].groupValue), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 10, sort);
assertScoreDocsEquals(td.scoreDocs, topGroups.groups[i].scoreDocs);
}
shard.close();
-
}
public void testGroupHeads() throws IOException {
@@ -164,7 +172,7 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
indexRandomDocs(shard.writer);
IndexSearcher searcher = shard.getIndexSearcher();
- String[] query = new String[]{ "foo", "bar", "baz" };
+ String[] query = new String[] {"foo", "bar", "baz"};
Query topLevel = new TermQuery(new Term("text", query[random().nextInt(query.length)]));
GroupSelector<T> groupSelector = getGroupSelector();
@@ -180,10 +188,11 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
int totalHits = searcher.count(topLevel);
int groupHits = 0;
for (T groupValue : matchingGroups) {
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(filterQuery(groupValue), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(filterQuery(groupValue), BooleanClause.Occur.FILTER)
+ .build();
groupHits += searcher.count(filtered);
}
assertEquals(totalHits, groupHits);
@@ -195,15 +204,17 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
cardinality++;
}
}
- assertEquals(matchingGroups.size(), cardinality); // We should have one set bit per matching group
+ assertEquals(
+ matchingGroups.size(), cardinality); // We should have one set bit per matching group
// Each group head should correspond to the topdoc of a search filtered by
// that group
for (T groupValue : matchingGroups) {
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(filterQuery(groupValue), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(filterQuery(groupValue), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 1);
assertTrue(groupHeads.get(td.scoreDocs[0].doc));
}
@@ -217,10 +228,13 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
indexRandomDocs(shard.writer);
IndexSearcher searcher = shard.getIndexSearcher();
- String[] query = new String[]{ "foo", "bar", "baz" };
+ String[] query = new String[] {"foo", "bar", "baz"};
Query topLevel = new TermQuery(new Term("text", query[random().nextInt(query.length)]));
- Sort sort = new Sort(new SortField("sort1", SortField.Type.STRING), new SortField("sort2", SortField.Type.LONG));
+ Sort sort =
+ new Sort(
+ new SortField("sort1", SortField.Type.STRING),
+ new SortField("sort2", SortField.Type.LONG));
GroupSelector<T> groupSelector = getGroupSelector();
GroupingSearch grouping = new GroupingSearch(groupSelector);
grouping.setAllGroups(true);
@@ -237,15 +251,17 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
cardinality++;
}
}
- assertEquals(matchingGroups.size(), cardinality); // We should have one set bit per matching group
+ assertEquals(
+ matchingGroups.size(), cardinality); // We should have one set bit per matching group
// Each group head should correspond to the topdoc of a search filtered by
// that group using the same within-group sort
for (T groupValue : matchingGroups) {
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(filterQuery(groupValue), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(filterQuery(groupValue), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 1, sort);
assertTrue(groupHeads.get(td.scoreDocs[0].doc));
}
@@ -263,7 +279,7 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
shards[i] = new Shard();
}
- String[] texts = new String[]{ "foo", "bar", "bar baz", "foo foo bar" };
+ String[] texts = new String[] {"foo", "bar", "bar baz", "foo foo bar"};
// Create a bunch of random documents, and index them - once into the control index,
// and once into a randomly picked shard.
@@ -282,29 +298,35 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
shards[shard].writer.addDocument(doc);
}
- String[] query = new String[]{ "foo", "bar", "baz" };
+ String[] query = new String[] {"foo", "bar", "baz"};
Query topLevel = new TermQuery(new Term("text", query[random().nextInt(query.length)]));
- Sort sort = new Sort(new SortField("sort1", SortField.Type.STRING), new SortField("sort2", SortField.Type.LONG));
+ Sort sort =
+ new Sort(
+ new SortField("sort1", SortField.Type.STRING),
+ new SortField("sort2", SortField.Type.LONG));
// A grouped query run in two phases against the control should give us the same
// result as the query run against shards and merged back together after each phase.
- FirstPassGroupingCollector<T> singletonFirstPass = new FirstPassGroupingCollector<>(getGroupSelector(), sort, 5);
+ FirstPassGroupingCollector<T> singletonFirstPass =
+ new FirstPassGroupingCollector<>(getGroupSelector(), sort, 5);
control.getIndexSearcher().search(topLevel, singletonFirstPass);
Collection<SearchGroup<T>> singletonGroups = singletonFirstPass.getTopGroups(0);
List<Collection<SearchGroup<T>>> shardGroups = new ArrayList<>();
for (Shard shard : shards) {
- FirstPassGroupingCollector<T> fc = new FirstPassGroupingCollector<>(getGroupSelector(), sort, 5);
+ FirstPassGroupingCollector<T> fc =
+ new FirstPassGroupingCollector<>(getGroupSelector(), sort, 5);
shard.getIndexSearcher().search(topLevel, fc);
shardGroups.add(fc.getTopGroups(0));
}
Collection<SearchGroup<T>> mergedGroups = SearchGroup.merge(shardGroups, 0, 5, sort);
assertEquals(singletonGroups, mergedGroups);
- TopGroupsCollector<T> singletonSecondPass = new TopGroupsCollector<>(getGroupSelector(), singletonGroups, sort,
- Sort.RELEVANCE, 5, true);
+ TopGroupsCollector<T> singletonSecondPass =
+ new TopGroupsCollector<>(
+ getGroupSelector(), singletonGroups, sort, Sort.RELEVANCE, 5, true);
control.getIndexSearcher().search(topLevel, singletonSecondPass);
TopGroups<T> singletonTopGroups = singletonSecondPass.getTopGroups(0);
@@ -313,12 +335,14 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
TopGroups<T>[] shardTopGroups = (TopGroups<T>[]) new TopGroups<?>[shards.length];
int j = 0;
for (Shard shard : shards) {
- TopGroupsCollector<T> sc = new TopGroupsCollector<>(getGroupSelector(), mergedGroups, sort, Sort.RELEVANCE, 5, true);
+ TopGroupsCollector<T> sc =
+ new TopGroupsCollector<>(getGroupSelector(), mergedGroups, sort, Sort.RELEVANCE, 5, true);
shard.getIndexSearcher().search(topLevel, sc);
shardTopGroups[j] = sc.getTopGroups(0);
j++;
}
- TopGroups<T> mergedTopGroups = TopGroups.merge(shardTopGroups, sort, Sort.RELEVANCE, 0, 5, TopGroups.ScoreMergeMode.None);
+ TopGroups<T> mergedTopGroups =
+ TopGroups.merge(shardTopGroups, sort, Sort.RELEVANCE, 0, 5, TopGroups.ScoreMergeMode.None);
assertNotNull(mergedTopGroups);
assertEquals(singletonTopGroups.totalGroupedHitCount, mergedTopGroups.totalGroupedHitCount);
@@ -327,18 +351,19 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
assertEquals(singletonTopGroups.groups.length, mergedTopGroups.groups.length);
for (int i = 0; i < singletonTopGroups.groups.length; i++) {
assertEquals(singletonTopGroups.groups[i].groupValue, mergedTopGroups.groups[i].groupValue);
- assertEquals(singletonTopGroups.groups[i].scoreDocs.length, mergedTopGroups.groups[i].scoreDocs.length);
+ assertEquals(
+ singletonTopGroups.groups[i].scoreDocs.length,
+ mergedTopGroups.groups[i].scoreDocs.length);
}
control.close();
for (Shard shard : shards) {
shard.close();
}
-
}
private void indexRandomDocs(RandomIndexWriter w) throws IOException {
- String[] texts = new String[]{ "foo", "bar", "bar baz", "foo foo bar" };
+ String[] texts = new String[] {"foo", "bar", "bar baz", "foo foo bar"};
int numDocs = atLeast(200);
for (int i = 0; i < numDocs; i++) {
@@ -356,10 +381,9 @@ public abstract class BaseGroupSelectorTestCase<T> extends AbstractGroupingTestC
private void assertSortsBefore(GroupDocs<T> first, GroupDocs<T> second) {
Object[] groupSortValues = second.groupSortValues;
Object[] prevSortValues = first.groupSortValues;
- assertTrue(((BytesRef)prevSortValues[0]).compareTo((BytesRef)groupSortValues[0]) <= 0);
+ assertTrue(((BytesRef) prevSortValues[0]).compareTo((BytesRef) groupSortValues[0]) <= 0);
if (prevSortValues[0].equals(groupSortValues[0])) {
- assertTrue((long)prevSortValues[1] <= (long)groupSortValues[1]);
+ assertTrue((long) prevSortValues[1] <= (long) groupSortValues[1]);
}
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupHeadsCollector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupHeadsCollector.java
index fef695f..9b7baae 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupHeadsCollector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupHeadsCollector.java
@@ -27,7 +27,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
-
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.BinaryDocValuesField;
import org.apache.lucene.document.Document;
@@ -61,10 +60,11 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
public void testBasic() throws Exception {
final String groupField = "author";
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
DocValuesType valueType = DocValuesType.SORTED;
// 0
@@ -137,34 +137,45 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
int maxDoc = reader.maxDoc();
Sort sortWithinGroup = new Sort(new SortField("id_1", SortField.Type.INT, true));
- AllGroupHeadsCollector<?> allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup);
+ AllGroupHeadsCollector<?> allGroupHeadsCollector =
+ createRandomCollector(groupField, sortWithinGroup);
indexSearcher.search(new TermQuery(new Term("content", "random")), allGroupHeadsCollector);
- assertTrue(arrayContains(new int[]{2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads()));
- assertTrue(openBitSetContains(new int[]{2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
+ assertTrue(arrayContains(new int[] {2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads()));
+ assertTrue(
+ openBitSetContains(
+ new int[] {2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup);
indexSearcher.search(new TermQuery(new Term("content", "some")), allGroupHeadsCollector);
- assertTrue(arrayContains(new int[]{2, 3, 4}, allGroupHeadsCollector.retrieveGroupHeads()));
- assertTrue(openBitSetContains(new int[]{2, 3, 4}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
+ assertTrue(arrayContains(new int[] {2, 3, 4}, allGroupHeadsCollector.retrieveGroupHeads()));
+ assertTrue(
+ openBitSetContains(
+ new int[] {2, 3, 4}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup);
indexSearcher.search(new TermQuery(new Term("content", "blob")), allGroupHeadsCollector);
- assertTrue(arrayContains(new int[]{1, 5}, allGroupHeadsCollector.retrieveGroupHeads()));
- assertTrue(openBitSetContains(new int[]{1, 5}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
+ assertTrue(arrayContains(new int[] {1, 5}, allGroupHeadsCollector.retrieveGroupHeads()));
+ assertTrue(
+ openBitSetContains(
+ new int[] {1, 5}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
// STRING sort type triggers different implementation
Sort sortWithinGroup2 = new Sort(new SortField("id_2", SortField.Type.STRING, true));
allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup2);
indexSearcher.search(new TermQuery(new Term("content", "random")), allGroupHeadsCollector);
- assertTrue(arrayContains(new int[]{2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads()));
- assertTrue(openBitSetContains(new int[]{2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
+ assertTrue(arrayContains(new int[] {2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads()));
+ assertTrue(
+ openBitSetContains(
+ new int[] {2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
Sort sortWithinGroup3 = new Sort(new SortField("id_2", SortField.Type.STRING, false));
allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup3);
indexSearcher.search(new TermQuery(new Term("content", "random")), allGroupHeadsCollector);
// 7 b/c higher doc id wins, even if order of field is in not in reverse.
- assertTrue(arrayContains(new int[]{0, 3, 4, 6}, allGroupHeadsCollector.retrieveGroupHeads()));
- assertTrue(openBitSetContains(new int[]{0, 3, 4, 6}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
+ assertTrue(arrayContains(new int[] {0, 3, 4, 6}, allGroupHeadsCollector.retrieveGroupHeads()));
+ assertTrue(
+ openBitSetContains(
+ new int[] {0, 3, 4, 6}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc));
indexSearcher.getIndexReader().close();
dir.close();
@@ -174,7 +185,8 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
int numberOfRuns = atLeast(1);
for (int iter = 0; iter < numberOfRuns; iter++) {
if (VERBOSE) {
- System.out.println(String.format(Locale.ROOT, "TEST: iter=%d total=%d", iter, numberOfRuns));
+ System.out.println(
+ String.format(Locale.ROOT, "TEST: iter=%d total=%d", iter, numberOfRuns));
}
final int numDocs = TestUtil.nextInt(random(), 100, 1000) * RANDOM_MULTIPLIER;
@@ -188,10 +200,11 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
for (int i = 0; i < numGroups; i++) {
String randomValue;
do {
- // B/c of DV based impl we can't see the difference between an empty string and a null value.
+ // B/c of DV based impl we can't see the difference between an empty string and a null
+ // value.
// For that reason we don't generate empty string groups.
randomValue = TestUtil.randomRealisticUnicodeString(random());
- //randomValue = TestUtil.randomSimpleString(random());
+ // randomValue = TestUtil.randomSimpleString(random());
} while ("".equals(randomValue));
groups.add(new BytesRef(randomValue));
}
@@ -213,10 +226,8 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
}
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())));
+ RandomIndexWriter w =
+ new RandomIndexWriter(random(), dir, newIndexWriterConfig(new MockAnalyzer(random())));
DocValuesType valueType = DocValuesType.SORTED;
Document doc = new Document();
@@ -250,17 +261,29 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
groupValue = groups.get(random().nextInt(groups.size()));
}
- final GroupDoc groupDoc = new GroupDoc(
- i,
- groupValue,
- groups.get(random().nextInt(groups.size())),
- groups.get(random().nextInt(groups.size())),
- new BytesRef(String.format(Locale.ROOT, "%05d", i)),
- contentStrings[random().nextInt(contentStrings.length)]
- );
+ final GroupDoc groupDoc =
+ new GroupDoc(
+ i,
+ groupValue,
+ groups.get(random().nextInt(groups.size())),
+ groups.get(random().nextInt(groups.size())),
+ new BytesRef(String.format(Locale.ROOT, "%05d", i)),
+ contentStrings[random().nextInt(contentStrings.length)]);
if (VERBOSE) {
- System.out.println(" doc content=" + groupDoc.content + " id=" + i + " group=" + (groupDoc.group == null ? "null" : groupDoc.group.utf8ToString()) + " sort1=" + groupDoc.sort1.utf8ToString() + " sort2=" + groupDoc.sort2.utf8ToString() + " sort3=" + groupDoc.sort3.utf8ToString());
+ System.out.println(
+ " doc content="
+ + groupDoc.content
+ + " id="
+ + i
+ + " group="
+ + (groupDoc.group == null ? "null" : groupDoc.group.utf8ToString())
+ + " sort1="
+ + groupDoc.sort1.utf8ToString()
+ + " sort2="
+ + groupDoc.sort2.utf8ToString()
+ + " sort3="
+ + groupDoc.sort3.utf8ToString());
}
groupDocs[i] = groupDoc;
@@ -296,7 +319,8 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
Set<Integer> seenIDs = new HashSet<>();
for (int contentID = 0; contentID < 3; contentID++) {
- final ScoreDoc[] hits = s.search(new TermQuery(new Term("content", "real" + contentID)), numDocs).scoreDocs;
+ final ScoreDoc[] hits =
+ s.search(new TermQuery(new Term("content", "real" + contentID)), numDocs).scoreDocs;
for (ScoreDoc hit : hits) {
int idValue = docIDToFieldId[hit.doc];
final GroupDoc gd = groupDocs[idValue];
@@ -315,19 +339,22 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
assertTrue(Float.isFinite(gd.score));
assertTrue(gd.score >= 0.0);
}
-
+
for (int searchIter = 0; searchIter < 100; searchIter++) {
-
+
if (VERBOSE) {
System.out.println("TEST: searchIter=" + searchIter);
}
-
+
final String searchTerm = "real" + random().nextInt(3);
boolean sortByScoreOnly = random().nextBoolean();
Sort sortWithinGroup = getRandomSort(sortByScoreOnly);
- AllGroupHeadsCollector<?> allGroupHeadsCollector = createRandomCollector("group", sortWithinGroup);
+ AllGroupHeadsCollector<?> allGroupHeadsCollector =
+ createRandomCollector("group", sortWithinGroup);
s.search(new TermQuery(new Term("content", searchTerm)), allGroupHeadsCollector);
- int[] expectedGroupHeads = createExpectedGroupHeads(searchTerm, groupDocs, sortWithinGroup, sortByScoreOnly, fieldIdToDocID);
+ int[] expectedGroupHeads =
+ createExpectedGroupHeads(
+ searchTerm, groupDocs, sortWithinGroup, sortByScoreOnly, fieldIdToDocID);
int[] actualGroupHeads = allGroupHeadsCollector.retrieveGroupHeads();
// The actual group heads contains Lucene ids. Need to change them into our id value.
for (int i = 0; i < actualGroupHeads.length; i++) {
@@ -336,7 +363,7 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
// Allows us the easily iterate and assert the actual and expected results.
Arrays.sort(expectedGroupHeads);
Arrays.sort(actualGroupHeads);
-
+
if (VERBOSE) {
System.out.println("Collector: " + allGroupHeadsCollector.getClass().getSimpleName());
System.out.println("Sort within group: " + sortWithinGroup);
@@ -345,41 +372,50 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
System.out.println("\n=== Expected: \n");
for (int expectedDocId : expectedGroupHeads) {
GroupDoc expectedGroupDoc = groupDocs[expectedDocId];
- String expectedGroup = expectedGroupDoc.group == null ? null : expectedGroupDoc.group.utf8ToString();
+ String expectedGroup =
+ expectedGroupDoc.group == null ? null : expectedGroupDoc.group.utf8ToString();
System.out.println(
- String.format(Locale.ROOT,
+ String.format(
+ Locale.ROOT,
"Group:%10s score%5f Sort1:%10s Sort2:%10s Sort3:%10s doc:%5d",
- expectedGroup, expectedGroupDoc.score, expectedGroupDoc.sort1.utf8ToString(),
- expectedGroupDoc.sort2.utf8ToString(), expectedGroupDoc.sort3.utf8ToString(), expectedDocId
- )
- );
+ expectedGroup,
+ expectedGroupDoc.score,
+ expectedGroupDoc.sort1.utf8ToString(),
+ expectedGroupDoc.sort2.utf8ToString(),
+ expectedGroupDoc.sort3.utf8ToString(),
+ expectedDocId));
}
System.out.println("\n=== Actual: \n");
for (int actualDocId : actualGroupHeads) {
GroupDoc actualGroupDoc = groupDocs[actualDocId];
- String actualGroup = actualGroupDoc.group == null ? null : actualGroupDoc.group.utf8ToString();
+ String actualGroup =
+ actualGroupDoc.group == null ? null : actualGroupDoc.group.utf8ToString();
System.out.println(
- String.format(Locale.ROOT,
+ String.format(
+ Locale.ROOT,
"Group:%10s score%5f Sort1:%10s Sort2:%10s Sort3:%10s doc:%5d",
- actualGroup, actualGroupDoc.score, actualGroupDoc.sort1.utf8ToString(),
- actualGroupDoc.sort2.utf8ToString(), actualGroupDoc.sort3.utf8ToString(), actualDocId
- )
- );
+ actualGroup,
+ actualGroupDoc.score,
+ actualGroupDoc.sort1.utf8ToString(),
+ actualGroupDoc.sort2.utf8ToString(),
+ actualGroupDoc.sort3.utf8ToString(),
+ actualDocId));
}
- System.out.println("\n===================================================================================");
+ System.out.println(
+ "\n===================================================================================");
}
-
+
assertArrayEquals(expectedGroupHeads, actualGroupHeads);
}
-
+
r.close();
dir.close();
}
}
-
private boolean arrayContains(int[] expected, int[] actual) {
- Arrays.sort(actual); // in some cases the actual docs aren't sorted by docid. This method expects that.
+ // in some cases the actual docs aren't sorted by docid. This method expects that.
+ Arrays.sort(actual);
if (expected.length != actual.length) {
return false;
}
@@ -401,9 +437,10 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
return true;
}
- private boolean openBitSetContains(int[] expectedDocs, Bits actual, int maxDoc) throws IOException {
+ private boolean openBitSetContains(int[] expectedDocs, Bits actual, int maxDoc)
+ throws IOException {
assert actual instanceof FixedBitSet;
- if (expectedDocs.length != ((FixedBitSet)actual).cardinality()) {
+ if (expectedDocs.length != ((FixedBitSet) actual).cardinality()) {
return false;
}
@@ -412,7 +449,12 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
expected.set(expectedDoc);
}
- for (int docId = expected.nextSetBit(0); docId != DocIdSetIterator.NO_MORE_DOCS; docId = docId + 1 >= expected.length() ? DocIdSetIterator.NO_MORE_DOCS : expected.nextSetBit(docId + 1)) {
+ for (int docId = expected.nextSetBit(0);
+ docId != DocIdSetIterator.NO_MORE_DOCS;
+ docId =
+ docId + 1 >= expected.length()
+ ? DocIdSetIterator.NO_MORE_DOCS
+ : expected.nextSetBit(docId + 1)) {
if (!actual.get(docId)) {
return false;
}
@@ -421,7 +463,12 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
return true;
}
- private int[] createExpectedGroupHeads(String searchTerm, GroupDoc[] groupDocs, Sort docSort, boolean sortByScoreOnly, int[] fieldIdToDocID) {
+ private int[] createExpectedGroupHeads(
+ String searchTerm,
+ GroupDoc[] groupDocs,
+ Sort docSort,
+ boolean sortByScoreOnly,
+ int[] fieldIdToDocID) {
Map<BytesRef, List<GroupDoc>> groupHeads = new HashMap<>();
for (GroupDoc groupDoc : groupDocs) {
if (!groupDoc.content.startsWith(searchTerm)) {
@@ -473,7 +520,8 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
return new Sort(sortFields.toArray(new SortField[sortFields.size()]));
}
- private Comparator<GroupDoc> getComparator(Sort sort, final boolean sortByScoreOnly, final int[] fieldIdToDocID) {
+ private Comparator<GroupDoc> getComparator(
+ Sort sort, final boolean sortByScoreOnly, final int[] fieldIdToDocID) {
final SortField[] sortFields = sort.getSort();
return new Comparator<GroupDoc>() {
@Override
@@ -509,19 +557,22 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
};
}
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
private AllGroupHeadsCollector<?> createRandomCollector(String groupField, Sort sortWithinGroup) {
if (random().nextBoolean()) {
ValueSource vs = new BytesRefFieldSource(groupField);
- return AllGroupHeadsCollector.newCollector(new ValueSourceGroupSelector(vs, new HashMap<>()), sortWithinGroup);
+ return AllGroupHeadsCollector.newCollector(
+ new ValueSourceGroupSelector(vs, new HashMap<>()), sortWithinGroup);
} else {
- return AllGroupHeadsCollector.newCollector(new TermGroupSelector(groupField), sortWithinGroup);
+ return AllGroupHeadsCollector.newCollector(
+ new TermGroupSelector(groupField), sortWithinGroup);
}
}
- private void addGroupField(Document doc, String groupField, String value, DocValuesType valueType) {
+ private void addGroupField(
+ Document doc, String groupField, String value, DocValuesType valueType) {
Field valuesField = null;
- switch(valueType) {
+ switch (valueType) {
case BINARY:
valuesField = new BinaryDocValuesField(groupField, new BytesRef(value));
break;
@@ -544,7 +595,8 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
final String content;
float score;
- public GroupDoc(int id, BytesRef group, BytesRef sort1, BytesRef sort2, BytesRef sort3, String content) {
+ public GroupDoc(
+ int id, BytesRef group, BytesRef sort1, BytesRef sort2, BytesRef sort3, String content) {
this.id = id;
this.group = group;
this.sort1 = sort1;
@@ -552,7 +604,5 @@ public class TestAllGroupHeadsCollector extends LuceneTestCase {
this.sort3 = sort3;
this.content = content;
}
-
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupsCollector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupsCollector.java
index ccdf3c3..73e7dc0 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupsCollector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestAllGroupsCollector.java
@@ -17,7 +17,6 @@
package org.apache.lucene.search.grouping;
import java.util.HashMap;
-
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@@ -43,10 +42,11 @@ public class TestAllGroupsCollector extends LuceneTestCase {
customType.setStored(true);
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
// 0
Document doc = new Document();
@@ -124,11 +124,9 @@ public class TestAllGroupsCollector extends LuceneTestCase {
private AllGroupsCollector<?> createRandomCollector(String groupField) {
if (random().nextBoolean()) {
return new AllGroupsCollector<>(new TermGroupSelector(groupField));
- }
- else {
+ } else {
ValueSource vs = new BytesRefFieldSource(groupField);
return new AllGroupsCollector<>(new ValueSourceGroupSelector(vs, new HashMap<>()));
}
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestBlockGrouping.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestBlockGrouping.java
index 78acbbf..e70ed27 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestBlockGrouping.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestBlockGrouping.java
@@ -20,7 +20,6 @@ package org.apache.lucene.search.grouping;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericDocValuesField;
@@ -65,16 +64,16 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
String bookName = searcher.doc(tg.groups[i].scoreDocs[0].doc).get("book");
// The contents of each group should be equal to the results of a search for
// that group alone
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(new TermQuery(new Term("book", bookName)), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(new TermQuery(new Term("book", bookName)), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 10);
assertScoreDocsEquals(td.scoreDocs, tg.groups[i].scoreDocs);
}
shard.close();
-
}
public void testTopLevelSort() throws IOException {
@@ -88,7 +87,8 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
Query blockEndQuery = new TermQuery(new Term("blockEnd", "true"));
GroupingSearch grouper = new GroupingSearch(blockEndQuery);
grouper.setGroupDocsLimit(10);
- grouper.setGroupSort(sort); // groups returned sorted by length, chapters within group sorted by relevancy
+ // groups returned sorted by length, chapters within group sorted by relevancy
+ grouper.setGroupSort(sort);
Query topLevel = new TermQuery(new Term("text", "grandmother"));
TopGroups<?> tg = grouper.search(searcher, topLevel, 0, 5);
@@ -96,16 +96,17 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
// The sort value of the top doc in the top group should be the same as the sort value
// of the top result from the same search done with no grouping
TopDocs topDoc = searcher.search(topLevel, 1, sort);
- assertEquals(((FieldDoc)topDoc.scoreDocs[0]).fields[0], tg.groups[0].groupSortValues[0]);
+ assertEquals(((FieldDoc) topDoc.scoreDocs[0]).fields[0], tg.groups[0].groupSortValues[0]);
for (int i = 0; i < tg.groups.length; i++) {
String bookName = searcher.doc(tg.groups[i].scoreDocs[0].doc).get("book");
// The contents of each group should be equal to the results of a search for
// that group alone, sorted by score
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(new TermQuery(new Term("book", bookName)), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(new TermQuery(new Term("book", bookName)), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 10);
assertScoreDocsEquals(td.scoreDocs, tg.groups[i].scoreDocs);
if (i > 1) {
@@ -114,7 +115,6 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
}
shard.close();
-
}
public void testWithinGroupSort() throws IOException {
@@ -128,7 +128,8 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
Query blockEndQuery = new TermQuery(new Term("blockEnd", "true"));
GroupingSearch grouper = new GroupingSearch(blockEndQuery);
grouper.setGroupDocsLimit(10);
- grouper.setSortWithinGroup(sort); // groups returned sorted by relevancy, chapters within group sorted by length
+ // groups returned sorted by relevancy, chapters within group sorted by length
+ grouper.setSortWithinGroup(sort);
Query topLevel = new TermQuery(new Term("text", "grandmother"));
TopGroups<?> tg = grouper.search(searcher, topLevel, 0, 5);
@@ -136,16 +137,17 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
// We're sorting by score, so the score of the top group should be the same as the
// score of the top document from the same query with no grouping
TopDocs topDoc = searcher.search(topLevel, 1);
- assertEquals(topDoc.scoreDocs[0].score, (float)tg.groups[0].groupSortValues[0], 0);
+ assertEquals(topDoc.scoreDocs[0].score, (float) tg.groups[0].groupSortValues[0], 0);
for (int i = 0; i < tg.groups.length; i++) {
String bookName = searcher.doc(tg.groups[i].scoreDocs[0].doc).get("book");
// The contents of each group should be equal to the results of a search for
// that group alone, sorted by length
- Query filtered = new BooleanQuery.Builder()
- .add(topLevel, BooleanClause.Occur.MUST)
- .add(new TermQuery(new Term("book", bookName)), BooleanClause.Occur.FILTER)
- .build();
+ Query filtered =
+ new BooleanQuery.Builder()
+ .add(topLevel, BooleanClause.Occur.MUST)
+ .add(new TermQuery(new Term("book", bookName)), BooleanClause.Occur.FILTER)
+ .build();
TopDocs td = searcher.search(filtered, 10, sort);
assertFieldDocsEquals(td.scoreDocs, tg.groups[i].scoreDocs);
// We're sorting by score, so the group sort value for each group should be a float,
@@ -188,14 +190,15 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
return block;
}
- private static final String[] TEXT = new String[]{
- "It was the day my grandmother exploded",
- "It was the best of times, it was the worst of times",
- "It was a bright cold morning in April",
- "It is a truth universally acknowledged",
- "I have just returned from a visit to my landlord",
- "I've been here and I've been there"
- };
+ private static final String[] TEXT =
+ new String[] {
+ "It was the day my grandmother exploded",
+ "It was the best of times, it was the worst of times",
+ "It was a bright cold morning in April",
+ "It is a truth universally acknowledged",
+ "I have just returned from a visit to my landlord",
+ "I've been here and I've been there"
+ };
private static String randomText() {
StringBuilder sb = new StringBuilder(TEXT[random().nextInt(TEXT.length)]);
@@ -209,7 +212,7 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
private void assertSortsBefore(GroupDocs<?> first, GroupDocs<?> second) {
Object[] groupSortValues = second.groupSortValues;
Object[] prevSortValues = first.groupSortValues;
- assertTrue(((Long)prevSortValues[0]).compareTo((Long)groupSortValues[0]) <= 0);
+ assertTrue(((Long) prevSortValues[0]).compareTo((Long) groupSortValues[0]) <= 0);
}
protected static void assertFieldDocsEquals(ScoreDoc[] expected, ScoreDoc[] actual) {
@@ -221,5 +224,4 @@ public class TestBlockGrouping extends AbstractGroupingTestCase {
assertArrayEquals(e.fields, a.fields);
}
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDistinctValuesCollector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDistinctValuesCollector.java
index cedbeea..8ec8e88 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDistinctValuesCollector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDistinctValuesCollector.java
@@ -29,7 +29,6 @@ import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;
-
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@@ -51,18 +50,19 @@ import org.apache.lucene.util.mutable.MutableValueStr;
public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
- private final static NullComparator nullComparator = new NullComparator();
-
+ private static final NullComparator nullComparator = new NullComparator();
+
private static final String GROUP_FIELD = "author";
private static final String COUNT_FIELD = "publisher";
public void testSimple() throws Exception {
Random random = random();
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random,
- dir,
- newIndexWriterConfig(new MockAnalyzer(random)).setMergePolicy(newLogMergePolicy()));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random,
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random)).setMergePolicy(newLogMergePolicy()));
Document doc = new Document();
addField(doc, GROUP_FIELD, "1");
addField(doc, COUNT_FIELD, "1");
@@ -120,27 +120,30 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
IndexSearcher indexSearcher = newSearcher(w.getReader());
w.close();
- Comparator<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> cmp = (groupCount1, groupCount2) -> {
- if (groupCount1.groupValue == null) {
- if (groupCount2.groupValue == null) {
- return 0;
- }
- return -1;
- } else if (groupCount2.groupValue == null) {
- return 1;
- } else {
- return groupCount1.groupValue.compareTo(groupCount2.groupValue);
- }
- };
+ Comparator<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> cmp =
+ (groupCount1, groupCount2) -> {
+ if (groupCount1.groupValue == null) {
+ if (groupCount2.groupValue == null) {
+ return 0;
+ }
+ return -1;
+ } else if (groupCount2.groupValue == null) {
+ return 1;
+ } else {
+ return groupCount1.groupValue.compareTo(groupCount2.groupValue);
+ }
+ };
// === Search for content:random
- FirstPassGroupingCollector<Comparable<Object>> firstCollector = createRandomFirstPassCollector(new Sort(), GROUP_FIELD, 10);
+ FirstPassGroupingCollector<Comparable<Object>> firstCollector =
+ createRandomFirstPassCollector(new Sort(), GROUP_FIELD, 10);
indexSearcher.search(new TermQuery(new Term("content", "random")), firstCollector);
- DistinctValuesCollector<Comparable<Object>, Comparable<Object>> distinctValuesCollector
- = createDistinctCountCollector(firstCollector, COUNT_FIELD);
+ DistinctValuesCollector<Comparable<Object>, Comparable<Object>> distinctValuesCollector =
+ createDistinctCountCollector(firstCollector, COUNT_FIELD);
indexSearcher.search(new TermQuery(new Term("content", "random")), distinctValuesCollector);
- List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> gcs = distinctValuesCollector.getGroups();
+ List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> gcs =
+ distinctValuesCollector.getGroups();
Collections.sort(gcs, cmp);
assertEquals(4, gcs.size());
@@ -193,7 +196,7 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
assertEquals(1, countValues.size());
compare("1", countValues.get(0));
- // === Search for content:blob
+ // === Search for content:blob
firstCollector = createRandomFirstPassCollector(new Sort(), GROUP_FIELD, 10);
indexSearcher.search(new TermQuery(new Term("content", "blob")), firstCollector);
distinctValuesCollector = createDistinctCountCollector(firstCollector, COUNT_FIELD);
@@ -229,33 +232,40 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
Sort groupSort = new Sort(new SortField("id", SortField.Type.STRING));
int topN = 1 + random.nextInt(10);
- List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> expectedResult = createExpectedResult(context, term, groupSort, topN);
+ List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>>
+ expectedResult = createExpectedResult(context, term, groupSort, topN);
- FirstPassGroupingCollector<Comparable<Object>> firstCollector = createRandomFirstPassCollector(groupSort, GROUP_FIELD, topN);
+ FirstPassGroupingCollector<Comparable<Object>> firstCollector =
+ createRandomFirstPassCollector(groupSort, GROUP_FIELD, topN);
searcher.search(new TermQuery(new Term("content", term)), firstCollector);
- DistinctValuesCollector<Comparable<Object>, Comparable<Object>> distinctValuesCollector
- = createDistinctCountCollector(firstCollector, COUNT_FIELD);
+ DistinctValuesCollector<Comparable<Object>, Comparable<Object>> distinctValuesCollector =
+ createDistinctCountCollector(firstCollector, COUNT_FIELD);
searcher.search(new TermQuery(new Term("content", term)), distinctValuesCollector);
@SuppressWarnings("unchecked")
- List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> actualResult = distinctValuesCollector.getGroups();
+ List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>>
+ actualResult = distinctValuesCollector.getGroups();
if (VERBOSE) {
System.out.println("Index iter=" + indexIter);
System.out.println("Search iter=" + searchIter);
- System.out.println("1st pass collector class name=" + firstCollector.getClass().getName());
- System.out.println("2nd pass collector class name=" + distinctValuesCollector.getClass().getName());
+ System.out.println(
+ "1st pass collector class name=" + firstCollector.getClass().getName());
+ System.out.println(
+ "2nd pass collector class name=" + distinctValuesCollector.getClass().getName());
System.out.println("Search term=" + term);
System.out.println("1st pass groups=" + firstCollector.getTopGroups(0));
- System.out.println("Expected:");
+ System.out.println("Expected:");
printGroups(expectedResult);
- System.out.println("Actual:");
+ System.out.println("Actual:");
printGroups(actualResult);
}
assertEquals(expectedResult.size(), actualResult.size());
for (int i = 0; i < expectedResult.size(); i++) {
- DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>> expected = expectedResult.get(i);
- DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>> actual = actualResult.get(i);
+ DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>> expected =
+ expectedResult.get(i);
+ DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>> actual =
+ actualResult.get(i);
assertValues(expected.groupValue, actual.groupValue);
assertEquals(expected.uniqueValues.size(), actual.uniqueValues.size());
List<Comparable<?>> expectedUniqueValues = new ArrayList<>(expected.uniqueValues);
@@ -272,16 +282,18 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
}
}
- private void printGroups(List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> results) {
- for(int i=0;i<results.size();i++) {
- DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>> group = results.get(i);
+ private void printGroups(
+ List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> results) {
+ for (int i = 0; i < results.size(); i++) {
+ DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>> group =
+ results.get(i);
Object gv = group.groupValue;
if (gv instanceof BytesRef) {
System.out.println(i + ": groupValue=" + ((BytesRef) gv).utf8ToString());
} else {
System.out.println(i + ": groupValue=" + gv);
}
- for(Object o : group.uniqueValues) {
+ for (Object o : group.uniqueValues) {
if (o instanceof BytesRef) {
System.out.println(" " + ((BytesRef) o).utf8ToString());
} else {
@@ -298,7 +310,7 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
compare(((BytesRef) expected).utf8ToString(), actual);
}
}
-
+
private void compare(String expected, Object groupValue) {
if (BytesRef.class.isAssignableFrom(groupValue.getClass())) {
assertEquals(expected, ((BytesRef) groupValue).utf8ToString());
@@ -338,13 +350,16 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
doc.add(new SortedDocValuesField(field, new BytesRef(value)));
}
- @SuppressWarnings({"unchecked","rawtypes"})
- private <T extends Comparable<Object>, R extends Comparable<Object>> DistinctValuesCollector<T, R> createDistinctCountCollector(FirstPassGroupingCollector<T> firstPassGroupingCollector,
- String countField) throws IOException {
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private <T extends Comparable<Object>, R extends Comparable<Object>>
+ DistinctValuesCollector<T, R> createDistinctCountCollector(
+ FirstPassGroupingCollector<T> firstPassGroupingCollector, String countField)
+ throws IOException {
Collection<SearchGroup<T>> searchGroups = firstPassGroupingCollector.getTopGroups(0);
GroupSelector<T> selector = firstPassGroupingCollector.getGroupSelector();
if (ValueSourceGroupSelector.class.isAssignableFrom(selector.getClass())) {
- GroupSelector gs = new ValueSourceGroupSelector(new BytesRefFieldSource(countField), new HashMap<>());
+ GroupSelector gs =
+ new ValueSourceGroupSelector(new BytesRefFieldSource(countField), new HashMap<>());
return new DistinctValuesCollector<>(selector, searchGroups, gs);
} else {
GroupSelector ts = new TermGroupSelector(countField);
@@ -352,18 +367,26 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
}
}
- @SuppressWarnings({"unchecked","rawtypes"})
- private <T> FirstPassGroupingCollector<T> createRandomFirstPassCollector(Sort groupSort, String groupField, int topNGroups) throws IOException {
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private <T> FirstPassGroupingCollector<T> createRandomFirstPassCollector(
+ Sort groupSort, String groupField, int topNGroups) throws IOException {
Random random = random();
if (random.nextBoolean()) {
- return (FirstPassGroupingCollector<T>) new FirstPassGroupingCollector<>(new ValueSourceGroupSelector(new BytesRefFieldSource(groupField), new HashMap<>()), groupSort, topNGroups);
+ return (FirstPassGroupingCollector<T>)
+ new FirstPassGroupingCollector<>(
+ new ValueSourceGroupSelector(new BytesRefFieldSource(groupField), new HashMap<>()),
+ groupSort,
+ topNGroups);
} else {
- return (FirstPassGroupingCollector<T>) new FirstPassGroupingCollector<>(new TermGroupSelector(groupField), groupSort, topNGroups);
+ return (FirstPassGroupingCollector<T>)
+ new FirstPassGroupingCollector<>(
+ new TermGroupSelector(groupField), groupSort, topNGroups);
}
}
- @SuppressWarnings({"unchecked","rawtypes"})
- private List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>> createExpectedResult(IndexContext context, String term, Sort groupSort, int topN) {
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private List<DistinctValuesCollector.GroupCount<Comparable<Object>, Comparable<Object>>>
+ createExpectedResult(IndexContext context, String term, Sort groupSort, int topN) {
List result = new ArrayList();
Map<String, Set<String>> groupCounts = context.searchTermToGroupCounts.get(term);
int i = 0;
@@ -375,7 +398,9 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
for (String val : groupCounts.get(group)) {
uniqueValues.add(val != null ? new BytesRef(val) : null);
}
- result.add(new DistinctValuesCollector.GroupCount(group != null ? new BytesRef(group) : null, uniqueValues));
+ result.add(
+ new DistinctValuesCollector.GroupCount(
+ group != null ? new BytesRef(group) : null, uniqueValues));
}
return result;
}
@@ -384,11 +409,11 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
Random random = random();
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random,
- dir,
- newIndexWriterConfig(new MockAnalyzer(random)).setMergePolicy(newLogMergePolicy())
- );
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random,
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random)).setMergePolicy(newLogMergePolicy()));
int numDocs = 86 + random.nextInt(1087) * RANDOM_MULTIPLIER;
String[] groupValues = new String[numDocs / 5];
@@ -399,12 +424,14 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
for (int i = 0; i < countValues.length; i++) {
countValues[i] = generateRandomNonEmptyString();
}
-
+
List<String> contentStrings = new ArrayList<>();
Map<String, Map<String, Set<String>>> searchTermToGroupCounts = new HashMap<>();
for (int i = 1; i <= numDocs; i++) {
- String groupValue = random.nextInt(23) == 14 ? null : groupValues[random.nextInt(groupValues.length)];
- String countValue = random.nextInt(21) == 13 ? null : countValues[random.nextInt(countValues.length)];
+ String groupValue =
+ random.nextInt(23) == 14 ? null : groupValues[random.nextInt(groupValues.length)];
+ String countValue =
+ random.nextInt(21) == 13 ? null : countValues[random.nextInt(countValues.length)];
String content = "random" + random.nextInt(numDocs / 20);
Map<String, Set<String>> groupToCounts = searchTermToGroupCounts.get(content);
if (groupToCounts == null) {
@@ -434,14 +461,28 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
DirectoryReader reader = w.getReader();
if (VERBOSE) {
- for(int docID=0;docID<reader.maxDoc();docID++) {
+ for (int docID = 0; docID < reader.maxDoc(); docID++) {
Document doc = reader.document(docID);
- System.out.println("docID=" + docID + " id=" + doc.get("id") + " content=" + doc.get("content") + " author=" + doc.get("author") + " publisher=" + doc.get("publisher"));
+ System.out.println(
+ "docID="
+ + docID
+ + " id="
+ + doc.get("id")
+ + " content="
+ + doc.get("content")
+ + " author="
+ + doc.get("author")
+ + " publisher="
+ + doc.get("publisher"));
}
}
w.close();
- return new IndexContext(dir, reader, searchTermToGroupCounts, contentStrings.toArray(new String[contentStrings.size()]));
+ return new IndexContext(
+ dir,
+ reader,
+ searchTermToGroupCounts,
+ contentStrings.toArray(new String[contentStrings.size()]));
}
private static class IndexContext {
@@ -451,8 +492,11 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
final Map<String, Map<String, Set<String>>> searchTermToGroupCounts;
final String[] contentStrings;
- IndexContext(Directory directory, DirectoryReader indexReader,
- Map<String, Map<String, Set<String>>> searchTermToGroupCounts, String[] contentStrings) {
+ IndexContext(
+ Directory directory,
+ DirectoryReader indexReader,
+ Map<String, Map<String, Set<String>>> searchTermToGroupCounts,
+ String[] contentStrings) {
this.directory = directory;
this.indexReader = indexReader;
this.searchTermToGroupCounts = searchTermToGroupCounts;
@@ -463,7 +507,7 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
private static class NullComparator implements Comparator<Comparable<?>> {
@Override
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
public int compare(Comparable a, Comparable b) {
if (a == b) {
return 0;
@@ -475,7 +519,5 @@ public class TestDistinctValuesCollector extends AbstractGroupingTestCase {
return a.compareTo(b);
}
}
-
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeFactory.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeFactory.java
index d6e05c3..0e52ef2 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeFactory.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeFactory.java
@@ -33,7 +33,5 @@ public class TestDoubleRangeFactory extends LuceneTestCase {
assertEquals(new DoubleRange(30, 40), factory.getRange(35, scratch));
assertEquals(new DoubleRange(50, Double.MAX_VALUE), factory.getRange(50, scratch));
assertEquals(new DoubleRange(50, Double.MAX_VALUE), factory.getRange(500, scratch));
-
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeGroupSelector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeGroupSelector.java
index 5350a04..ada3c04 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeGroupSelector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestDoubleRangeGroupSelector.java
@@ -32,7 +32,7 @@ public class TestDoubleRangeGroupSelector extends BaseGroupSelectorTestCase<Doub
@Override
protected void addGroupField(Document document, int id) {
if (rarely()) {
- return; // missing value
+ return; // missing value
}
// numbers between 0 and 1000, groups are 100 wide from 100 to 900
double value = random().nextDouble() * 1000;
@@ -42,8 +42,8 @@ public class TestDoubleRangeGroupSelector extends BaseGroupSelectorTestCase<Doub
@Override
protected GroupSelector<DoubleRange> getGroupSelector() {
- return new DoubleRangeGroupSelector(DoubleValuesSource.fromDoubleField("double"),
- new DoubleRangeFactory(100, 100, 900));
+ return new DoubleRangeGroupSelector(
+ DoubleValuesSource.fromDoubleField("double"), new DoubleRangeFactory(100, 100, 900));
}
@Override
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupFacetCollector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupFacetCollector.java
index fffcd69..8060e15 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupFacetCollector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupFacetCollector.java
@@ -29,7 +29,6 @@ import java.util.NavigableSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
-
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@@ -48,7 +47,6 @@ import org.apache.lucene.store.Directory;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.TestUtil;
-
public class TestGroupFacetCollector extends AbstractGroupingTestCase {
public void testSimple() throws Exception {
@@ -57,10 +55,11 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
customType.setStored(true);
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
boolean useDv = true;
// 0
@@ -104,18 +103,19 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
List<TermGroupFacetCollector.FacetEntry> entries;
GroupFacetCollector groupedAirportFacetCollector;
TermGroupFacetCollector.GroupedFacetResult airportResult;
-
- for (int limit : new int[] { 2, 10, 100, Integer.MAX_VALUE }) {
+
+ for (int limit : new int[] {2, 10, 100, Integer.MAX_VALUE}) {
// any of these limits is plenty for the data we have
- groupedAirportFacetCollector = createRandomCollector
- (useDv ? "hotel_dv" : "hotel",
- useDv ? "airport_dv" : "airport", null, false);
+ groupedAirportFacetCollector =
+ createRandomCollector(
+ useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, false);
indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
int maxOffset = 5;
- airportResult = groupedAirportFacetCollector.mergeSegmentResults
- (Integer.MAX_VALUE == limit ? limit : maxOffset + limit, 0, false);
-
+ airportResult =
+ groupedAirportFacetCollector.mergeSegmentResults(
+ Integer.MAX_VALUE == limit ? limit : maxOffset + limit, 0, false);
+
assertEquals(3, airportResult.getTotalCount());
assertEquals(0, airportResult.getTotalMissingCount());
@@ -135,9 +135,12 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
assertEquals(1, entries.get(0).getCount());
}
- GroupFacetCollector groupedDurationFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", null, false);
+ GroupFacetCollector groupedDurationFacetCollector =
+ createRandomCollector(
+ useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", null, false);
indexSearcher.search(new MatchAllDocsQuery(), groupedDurationFacetCollector);
- TermGroupFacetCollector.GroupedFacetResult durationResult = groupedDurationFacetCollector.mergeSegmentResults(10, 0, false);
+ TermGroupFacetCollector.GroupedFacetResult durationResult =
+ groupedDurationFacetCollector.mergeSegmentResults(10, 0, false);
assertEquals(4, durationResult.getTotalCount());
assertEquals(0, durationResult.getTotalMissingCount());
@@ -181,7 +184,9 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
indexSearcher.getIndexReader().close();
indexSearcher = newSearcher(w.getReader());
- groupedAirportFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, !useDv);
+ groupedAirportFacetCollector =
+ createRandomCollector(
+ useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, !useDv);
indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
airportResult = groupedAirportFacetCollector.mergeSegmentResults(3, 0, true);
entries = airportResult.getFacetEntries(1, 2);
@@ -202,7 +207,9 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
assertEquals(1, entries.get(1).getCount());
}
- groupedDurationFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", null, false);
+ groupedDurationFacetCollector =
+ createRandomCollector(
+ useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", null, false);
indexSearcher.search(new MatchAllDocsQuery(), groupedDurationFacetCollector);
durationResult = groupedDurationFacetCollector.mergeSegmentResults(10, 2, true);
assertEquals(5, durationResult.getTotalCount());
@@ -229,7 +236,9 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
indexSearcher.getIndexReader().close();
indexSearcher = newSearcher(w.getReader());
- groupedAirportFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, false);
+ groupedAirportFacetCollector =
+ createRandomCollector(
+ useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, false);
indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
airportResult = groupedAirportFacetCollector.mergeSegmentResults(10, 0, false);
entries = airportResult.getFacetEntries(0, 10);
@@ -257,7 +266,9 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
assertEquals(2, entries.get(2).getCount());
}
- groupedDurationFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", "1", false);
+ groupedDurationFacetCollector =
+ createRandomCollector(
+ useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", "1", false);
indexSearcher.search(new MatchAllDocsQuery(), groupedDurationFacetCollector);
durationResult = groupedDurationFacetCollector.mergeSegmentResults(10, 0, true);
assertEquals(5, durationResult.getTotalCount());
@@ -281,10 +292,12 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
customType.setStored(true);
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(NoMergePolicy.INSTANCE));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random()))
+ .setMergePolicy(NoMergePolicy.INSTANCE));
boolean useDv = true;
// Cannot assert this since we use NoMergePolicy:
@@ -343,9 +356,11 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
w.close();
IndexSearcher indexSearcher = newSearcher(DirectoryReader.open(dir));
- GroupFacetCollector groupedAirportFacetCollector = createRandomCollector(groupField + "_dv", "airport", null, true);
+ GroupFacetCollector groupedAirportFacetCollector =
+ createRandomCollector(groupField + "_dv", "airport", null, true);
indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
- TermGroupFacetCollector.GroupedFacetResult airportResult = groupedAirportFacetCollector.mergeSegmentResults(10, 0, false);
+ TermGroupFacetCollector.GroupedFacetResult airportResult =
+ groupedAirportFacetCollector.mergeSegmentResults(10, 0, false);
assertEquals(3, airportResult.getTotalCount());
assertEquals(1, airportResult.getTotalMissingCount());
@@ -385,9 +400,11 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
int limit = random.nextInt(context.facetValues.size());
int offset = random.nextInt(context.facetValues.size() - limit);
int size = offset + limit;
- int minCount = random.nextBoolean() ? 0 : random.nextInt(1 + context.facetWithMostGroups / 10);
+ int minCount =
+ random.nextBoolean() ? 0 : random.nextInt(1 + context.facetWithMostGroups / 10);
boolean orderByCount = random.nextBoolean();
- String randomStr = getFromSet(context.facetValues, random.nextInt(context.facetValues.size()));
+ String randomStr =
+ getFromSet(context.facetValues, random.nextInt(context.facetValues.size()));
final String facetPrefix;
if (randomStr == null) {
facetPrefix = null;
@@ -402,13 +419,19 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
}
}
- GroupedFacetResult expectedFacetResult = createExpectedFacetResult(searchTerm, context, offset, limit, minCount, orderByCount, facetPrefix);
- GroupFacetCollector groupFacetCollector = createRandomCollector("group", "facet", facetPrefix, multipleFacetsPerDocument);
+ GroupedFacetResult expectedFacetResult =
+ createExpectedFacetResult(
+ searchTerm, context, offset, limit, minCount, orderByCount, facetPrefix);
+ GroupFacetCollector groupFacetCollector =
+ createRandomCollector("group", "facet", facetPrefix, multipleFacetsPerDocument);
searcher.search(new TermQuery(new Term("content", searchTerm)), groupFacetCollector);
- TermGroupFacetCollector.GroupedFacetResult actualFacetResult = groupFacetCollector.mergeSegmentResults(size, minCount, orderByCount);
+ TermGroupFacetCollector.GroupedFacetResult actualFacetResult =
+ groupFacetCollector.mergeSegmentResults(size, minCount, orderByCount);
- List<TermGroupFacetCollector.FacetEntry> expectedFacetEntries = expectedFacetResult.getFacetEntries();
- List<TermGroupFacetCollector.FacetEntry> actualFacetEntries = actualFacetResult.getFacetEntries(offset, limit);
+ List<TermGroupFacetCollector.FacetEntry> expectedFacetEntries =
+ expectedFacetResult.getFacetEntries();
+ List<TermGroupFacetCollector.FacetEntry> actualFacetEntries =
+ actualFacetResult.getFacetEntries(offset, limit);
if (VERBOSE) {
System.out.println("Collector: " + groupFacetCollector.getClass().getSimpleName());
@@ -431,11 +454,12 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
int counter = 0;
for (TermGroupFacetCollector.FacetEntry expectedFacetEntry : expectedFacetEntries) {
System.out.println(
- String.format(Locale.ROOT,
+ String.format(
+ Locale.ROOT,
"%d. Expected facet value %s with count %d",
- counter++, expectedFacetEntry.getValue().utf8ToString(), expectedFacetEntry.getCount()
- )
- );
+ counter++,
+ expectedFacetEntry.getValue().utf8ToString(),
+ expectedFacetEntry.getCount()));
}
System.out.println("\n=== Actual: \n");
@@ -444,23 +468,42 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
counter = 0;
for (TermGroupFacetCollector.FacetEntry actualFacetEntry : actualFacetEntries) {
System.out.println(
- String.format(Locale.ROOT,
+ String.format(
+ Locale.ROOT,
"%d. Actual facet value %s with count %d",
- counter++, actualFacetEntry.getValue().utf8ToString(), actualFacetEntry.getCount()
- )
- );
+ counter++,
+ actualFacetEntry.getValue().utf8ToString(),
+ actualFacetEntry.getCount()));
}
- System.out.println("\n===================================================================================");
+ System.out.println(
+ "\n===================================================================================");
}
-
+
assertEquals(expectedFacetResult.getTotalCount(), actualFacetResult.getTotalCount());
- assertEquals(expectedFacetResult.getTotalMissingCount(), actualFacetResult.getTotalMissingCount());
+ assertEquals(
+ expectedFacetResult.getTotalMissingCount(), actualFacetResult.getTotalMissingCount());
assertEquals(expectedFacetEntries.size(), actualFacetEntries.size());
for (int i = 0; i < expectedFacetEntries.size(); i++) {
TermGroupFacetCollector.FacetEntry expectedFacetEntry = expectedFacetEntries.get(i);
TermGroupFacetCollector.FacetEntry actualFacetEntry = actualFacetEntries.get(i);
- assertEquals("i=" + i + ": " + expectedFacetEntry.getValue().utf8ToString() + " != " + actualFacetEntry.getValue().utf8ToString(), expectedFacetEntry.getValue(), actualFacetEntry.getValue());
- assertEquals("i=" + i + ": " + expectedFacetEntry.getCount() + " != " + actualFacetEntry.getCount(), expectedFacetEntry.getCount(), actualFacetEntry.getCount());
+ assertEquals(
+ "i="
+ + i
+ + ": "
+ + expectedFacetEntry.getValue().utf8ToString()
+ + " != "
+ + actualFacetEntry.getValue().utf8ToString(),
+ expectedFacetEntry.getValue(),
+ actualFacetEntry.getValue());
+ assertEquals(
+ "i="
+ + i
+ + ": "
+ + expectedFacetEntry.getCount()
+ + " != "
+ + actualFacetEntry.getCount(),
+ expectedFacetEntry.getCount(),
+ actualFacetEntry.getCount());
}
}
@@ -469,7 +512,8 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
}
}
- private IndexContext createIndexContext(boolean multipleFacetValuesPerDocument) throws IOException {
+ private IndexContext createIndexContext(boolean multipleFacetValuesPerDocument)
+ throws IOException {
final Random random = random();
final int numDocs = TestUtil.nextInt(random, 138, 1145) * RANDOM_MULTIPLIER;
final int numGroups = TestUtil.nextInt(random, 1, numDocs / 4);
@@ -499,11 +543,8 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
}
Directory dir = newDirectory();
- RandomIndexWriter writer = new RandomIndexWriter(
- random,
- dir,
- newIndexWriterConfig(new MockAnalyzer(random))
- );
+ RandomIndexWriter writer =
+ new RandomIndexWriter(random, dir, newIndexWriterConfig(new MockAnalyzer(random)));
Document doc = new Document();
Document docNoGroup = new Document();
Document docNoFacet = new Document();
@@ -524,7 +565,8 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
doc.add(facetFields[1]);
docNoGroup.add(facetFields[1]);
} else {
- facetFields = multipleFacetValuesPerDocument ? new Field[2 + random.nextInt(6)] : new Field[1];
+ facetFields =
+ multipleFacetValuesPerDocument ? new Field[2 + random.nextInt(6)] : new Field[1];
for (int i = 0; i < facetFields.length; i++) {
facetFields[i] = new SortedSetDocValuesField("facet", new BytesRef());
doc.add(facetFields[i]);
@@ -537,22 +579,23 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
docNoFacet.add(content);
docNoGroupNoFacet.add(content);
- NavigableSet<String> uniqueFacetValues = new TreeSet<>(new Comparator<String>() {
-
- @Override
- public int compare(String a, String b) {
- if (a == b) {
- return 0;
- } else if (a == null) {
- return -1;
- } else if (b == null) {
- return 1;
- } else {
- return a.compareTo(b);
- }
- }
-
- });
+ NavigableSet<String> uniqueFacetValues =
+ new TreeSet<>(
+ new Comparator<String>() {
+
+ @Override
+ public int compare(String a, String b) {
+ if (a == b) {
+ return 0;
+ } else if (a == null) {
+ return -1;
+ } else if (b == null) {
+ return 1;
+ } else {
+ return a.compareTo(b);
+ }
+ }
+ });
Map<String, Map<String, Set<String>>> searchTermToFacetToGroups = new HashMap<>();
int facetWithMostGroups = 0;
for (int i = 0; i < numDocs; i++) {
@@ -604,7 +647,13 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
}
if (VERBOSE) {
- System.out.println(" doc content=" + contentStr + " group=" + (groupValue == null ? "null" : groupValue) + " facetVals=" + facetVals);
+ System.out.println(
+ " doc content="
+ + contentStr
+ + " group="
+ + (groupValue == null ? "null" : groupValue)
+ + " facetVals="
+ + facetVals);
}
if (groupValue != null) {
@@ -630,10 +679,25 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
DirectoryReader reader = writer.getReader();
writer.close();
- return new IndexContext(searchTermToFacetToGroups, reader, numDocs, dir, facetWithMostGroups, numGroups, contentBrs, uniqueFacetValues);
+ return new IndexContext(
+ searchTermToFacetToGroups,
+ reader,
+ numDocs,
+ dir,
+ facetWithMostGroups,
+ numGroups,
+ contentBrs,
+ uniqueFacetValues);
}
- private GroupedFacetResult createExpectedFacetResult(String searchTerm, IndexContext context, int offset, int limit, int minCount, final boolean orderByCount, String facetPrefix) {
+ private GroupedFacetResult createExpectedFacetResult(
+ String searchTerm,
+ IndexContext context,
+ int offset,
+ int limit,
+ int minCount,
+ final boolean orderByCount,
+ String facetPrefix) {
Map<String, Set<String>> facetGroups = context.searchTermToFacetGroups.get(searchTerm);
if (facetGroups == null) {
facetGroups = new HashMap<>();
@@ -676,20 +740,22 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
}
}
- Collections.sort(entries, new Comparator<TermGroupFacetCollector.FacetEntry>() {
-
- @Override
- public int compare(TermGroupFacetCollector.FacetEntry a, TermGroupFacetCollector.FacetEntry b) {
- if (orderByCount) {
- int cmp = b.getCount() - a.getCount();
- if (cmp != 0) {
- return cmp;
+ Collections.sort(
+ entries,
+ new Comparator<TermGroupFacetCollector.FacetEntry>() {
+
+ @Override
+ public int compare(
+ TermGroupFacetCollector.FacetEntry a, TermGroupFacetCollector.FacetEntry b) {
+ if (orderByCount) {
+ int cmp = b.getCount() - a.getCount();
+ if (cmp != 0) {
+ return cmp;
+ }
+ }
+ return a.getValue().compareTo(b.getValue());
}
- }
- return a.getValue().compareTo(b.getValue());
- }
-
- });
+ });
int endOffset = offset + limit;
List<TermGroupFacetCollector.FacetEntry> entriesResult;
@@ -703,9 +769,11 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
return new GroupedFacetResult(totalCount, totalMissCount, entriesResult);
}
- private GroupFacetCollector createRandomCollector(String groupField, String facetField, String facetPrefix, boolean multipleFacetsPerDocument) {
+ private GroupFacetCollector createRandomCollector(
+ String groupField, String facetField, String facetPrefix, boolean multipleFacetsPerDocument) {
BytesRef facetPrefixBR = facetPrefix == null ? null : new BytesRef(facetPrefix);
- return TermGroupFacetCollector.createTermGroupFacetCollector(groupField, facetField, multipleFacetsPerDocument, facetPrefixBR, random().nextInt(1024));
+ return TermGroupFacetCollector.createTermGroupFacetCollector(
+ groupField, facetField, multipleFacetsPerDocument, facetPrefixBR, random().nextInt(1024));
}
private String getFromSet(Set<String> set, int index) {
@@ -730,8 +798,15 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
final int numGroups;
final String[] contentStrings;
- public IndexContext(Map<String, Map<String, Set<String>>> searchTermToFacetGroups, DirectoryReader r,
- int numDocs, Directory dir, int facetWithMostGroups, int numGroups, String[] contentStrings, NavigableSet<String> facetValues) {
+ public IndexContext(
+ Map<String, Map<String, Set<String>>> searchTermToFacetGroups,
+ DirectoryReader r,
+ int numDocs,
+ Directory dir,
+ int facetWithMostGroups,
+ int numGroups,
+ String[] contentStrings,
+ NavigableSet<String> facetValues) {
this.searchTermToFacetGroups = searchTermToFacetGroups;
this.indexReader = r;
this.numDocs = numDocs;
@@ -749,7 +824,10 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
final int totalMissingCount;
final List<TermGroupFacetCollector.FacetEntry> facetEntries;
- private GroupedFacetResult(int totalCount, int totalMissingCount, List<TermGroupFacetCollector.FacetEntry> facetEntries) {
+ private GroupedFacetResult(
+ int totalCount,
+ int totalMissingCount,
+ List<TermGroupFacetCollector.FacetEntry> facetEntries) {
this.totalCount = totalCount;
this.totalMissingCount = totalMissingCount;
this.facetEntries = facetEntries;
@@ -767,5 +845,4 @@ public class TestGroupFacetCollector extends AbstractGroupingTestCase {
return facetEntries;
}
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
index 4ef6c02..df53dff 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
@@ -27,7 +27,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@@ -84,10 +83,11 @@ public class TestGrouping extends LuceneTestCase {
customType.setStored(true);
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
// 0
Document doc = new Document();
addGroupField(doc, groupField, "author1");
@@ -143,10 +143,12 @@ public class TestGrouping extends LuceneTestCase {
final Sort groupSort = Sort.RELEVANCE;
- final FirstPassGroupingCollector<?> c1 = createRandomFirstPassCollector(groupField, groupSort, 10);
+ final FirstPassGroupingCollector<?> c1 =
+ createRandomFirstPassCollector(groupField, groupSort, 10);
indexSearcher.search(new TermQuery(new Term("content", "random")), c1);
- final TopGroupsCollector<?> c2 = createSecondPassCollector(c1, groupSort, Sort.RELEVANCE, 0, 5, true);
+ final TopGroupsCollector<?> c2 =
+ createSecondPassCollector(c1, groupSort, Sort.RELEVANCE, 0, 5, true);
indexSearcher.search(new TermQuery(new Term("content", "random")), c2);
final TopGroups<?> groups = c2.getTopGroups(0);
@@ -194,49 +196,74 @@ public class TestGrouping extends LuceneTestCase {
doc.add(new SortedDocValuesField(groupField, new BytesRef(value)));
}
- private FirstPassGroupingCollector<?> createRandomFirstPassCollector(String groupField, Sort groupSort, int topDocs) throws IOException {
+ private FirstPassGroupingCollector<?> createRandomFirstPassCollector(
+ String groupField, Sort groupSort, int topDocs) throws IOException {
if (random().nextBoolean()) {
ValueSource vs = new BytesRefFieldSource(groupField);
- return new FirstPassGroupingCollector<>(new ValueSourceGroupSelector(vs, new HashMap<>()), groupSort, topDocs);
+ return new FirstPassGroupingCollector<>(
+ new ValueSourceGroupSelector(vs, new HashMap<>()), groupSort, topDocs);
} else {
- return new FirstPassGroupingCollector<>(new TermGroupSelector(groupField), groupSort, topDocs);
+ return new FirstPassGroupingCollector<>(
+ new TermGroupSelector(groupField), groupSort, topDocs);
}
}
- private FirstPassGroupingCollector<?> createFirstPassCollector(String groupField, Sort groupSort, int topDocs, FirstPassGroupingCollector<?> firstPassGroupingCollector) throws IOException {
+ private FirstPassGroupingCollector<?> createFirstPassCollector(
+ String groupField,
+ Sort groupSort,
+ int topDocs,
+ FirstPassGroupingCollector<?> firstPassGroupingCollector)
+ throws IOException {
GroupSelector<?> selector = firstPassGroupingCollector.getGroupSelector();
if (TermGroupSelector.class.isAssignableFrom(selector.getClass())) {
ValueSource vs = new BytesRefFieldSource(groupField);
- return new FirstPassGroupingCollector<>(new ValueSourceGroupSelector(vs, new HashMap<>()), groupSort, topDocs);
+ return new FirstPassGroupingCollector<>(
+ new ValueSourceGroupSelector(vs, new HashMap<>()), groupSort, topDocs);
} else {
- return new FirstPassGroupingCollector<>(new TermGroupSelector(groupField), groupSort, topDocs);
+ return new FirstPassGroupingCollector<>(
+ new TermGroupSelector(groupField), groupSort, topDocs);
}
}
- @SuppressWarnings({"unchecked","rawtypes"})
- private <T> TopGroupsCollector<T> createSecondPassCollector(FirstPassGroupingCollector firstPassGroupingCollector,
- Sort groupSort,
- Sort sortWithinGroup,
- int groupOffset,
- int maxDocsPerGroup,
- boolean getMaxScores) throws IOException {
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private <T> TopGroupsCollector<T> createSecondPassCollector(
+ FirstPassGroupingCollector firstPassGroupingCollector,
+ Sort groupSort,
+ Sort sortWithinGroup,
+ int groupOffset,
+ int maxDocsPerGroup,
+ boolean getMaxScores)
+ throws IOException {
Collection<SearchGroup<T>> searchGroups = firstPassGroupingCollector.getTopGroups(groupOffset);
- return new TopGroupsCollector<>(firstPassGroupingCollector.getGroupSelector(), searchGroups, groupSort, sortWithinGroup, maxDocsPerGroup, getMaxScores);
+ return new TopGroupsCollector<>(
+ firstPassGroupingCollector.getGroupSelector(),
+ searchGroups,
+ groupSort,
+ sortWithinGroup,
+ maxDocsPerGroup,
+ getMaxScores);
}
// Basically converts searchGroups from MutableValue to BytesRef if grouping by ValueSource
@SuppressWarnings("unchecked")
- private TopGroupsCollector<?> createSecondPassCollector(FirstPassGroupingCollector<?> firstPassGroupingCollector,
- String groupField,
- Collection<SearchGroup<BytesRef>> searchGroups,
- Sort groupSort,
- Sort sortWithinGroup,
- int maxDocsPerGroup,
- boolean getMaxScores) throws IOException {
- if (firstPassGroupingCollector.getGroupSelector().getClass().isAssignableFrom(TermGroupSelector.class)) {
- GroupSelector<BytesRef> selector = (GroupSelector<BytesRef>) firstPassGroupingCollector.getGroupSelector();
- return new TopGroupsCollector<>(selector, searchGroups, groupSort, sortWithinGroup, maxDocsPerGroup, getMaxScores);
+ private TopGroupsCollector<?> createSecondPassCollector(
+ FirstPassGroupingCollector<?> firstPassGroupingCollector,
+ String groupField,
+ Collection<SearchGroup<BytesRef>> searchGroups,
+ Sort groupSort,
+ Sort sortWithinGroup,
+ int maxDocsPerGroup,
+ boolean getMaxScores)
+ throws IOException {
+ if (firstPassGroupingCollector
+ .getGroupSelector()
+ .getClass()
+ .isAssignableFrom(TermGroupSelector.class)) {
+ GroupSelector<BytesRef> selector =
+ (GroupSelector<BytesRef>) firstPassGroupingCollector.getGroupSelector();
+ return new TopGroupsCollector<>(
+ selector, searchGroups, groupSort, sortWithinGroup, maxDocsPerGroup, getMaxScores);
} else {
ValueSource vs = new BytesRefFieldSource(groupField);
List<SearchGroup<MutableValue>> mvalSearchGroups = new ArrayList<>(searchGroups.size());
@@ -253,12 +280,13 @@ public class TestGrouping extends LuceneTestCase {
mvalSearchGroups.add(sg);
}
ValueSourceGroupSelector selector = new ValueSourceGroupSelector(vs, new HashMap<>());
- return new TopGroupsCollector<>(selector, mvalSearchGroups, groupSort, sortWithinGroup, maxDocsPerGroup, getMaxScores);
+ return new TopGroupsCollector<>(
+ selector, mvalSearchGroups, groupSort, sortWithinGroup, maxDocsPerGroup, getMaxScores);
}
}
- private AllGroupsCollector<?> createAllGroupsCollector(FirstPassGroupingCollector<?> firstPassGroupingCollector,
- String groupField) {
+ private AllGroupsCollector<?> createAllGroupsCollector(
+ FirstPassGroupingCollector<?> firstPassGroupingCollector, String groupField) {
return new AllGroupsCollector<>(firstPassGroupingCollector.getGroupSelector());
}
@@ -285,15 +313,18 @@ public class TestGrouping extends LuceneTestCase {
}
}
- private Collection<SearchGroup<BytesRef>> getSearchGroups(FirstPassGroupingCollector<?> c, int groupOffset) throws IOException {
+ private Collection<SearchGroup<BytesRef>> getSearchGroups(
+ FirstPassGroupingCollector<?> c, int groupOffset) throws IOException {
if (TermGroupSelector.class.isAssignableFrom(c.getGroupSelector().getClass())) {
@SuppressWarnings("unchecked")
FirstPassGroupingCollector<BytesRef> collector = (FirstPassGroupingCollector<BytesRef>) c;
return collector.getTopGroups(groupOffset);
} else if (ValueSourceGroupSelector.class.isAssignableFrom(c.getGroupSelector().getClass())) {
@SuppressWarnings("unchecked")
- FirstPassGroupingCollector<MutableValue> collector = (FirstPassGroupingCollector<MutableValue>) c;
- Collection<SearchGroup<MutableValue>> mutableValueGroups = collector.getTopGroups(groupOffset);
+ FirstPassGroupingCollector<MutableValue> collector =
+ (FirstPassGroupingCollector<MutableValue>) c;
+ Collection<SearchGroup<MutableValue>> mutableValueGroups =
+ collector.getTopGroups(groupOffset);
if (mutableValueGroups == null) {
return null;
}
@@ -301,7 +332,10 @@ public class TestGrouping extends LuceneTestCase {
List<SearchGroup<BytesRef>> groups = new ArrayList<>(mutableValueGroups.size());
for (SearchGroup<MutableValue> mutableValueGroup : mutableValueGroups) {
SearchGroup<BytesRef> sg = new SearchGroup<>();
- sg.groupValue = mutableValueGroup.groupValue.exists() ? ((MutableValueStr) mutableValueGroup.groupValue).value.get() : null;
+ sg.groupValue =
+ mutableValueGroup.groupValue.exists()
+ ? ((MutableValueStr) mutableValueGroup.groupValue).value.get()
+ : null;
sg.sortValues = mutableValueGroup.sortValues;
groups.add(sg);
}
@@ -321,12 +355,27 @@ public class TestGrouping extends LuceneTestCase {
TopGroups<MutableValue> mvalTopGroups = collector.getTopGroups(withinGroupOffset);
List<GroupDocs<BytesRef>> groups = new ArrayList<>(mvalTopGroups.groups.length);
for (GroupDocs<MutableValue> mvalGd : mvalTopGroups.groups) {
- BytesRef groupValue = mvalGd.groupValue.exists() ? ((MutableValueStr) mvalGd.groupValue).value.get() : null;
- groups.add(new GroupDocs<>(Float.NaN, mvalGd.maxScore, mvalGd.totalHits, mvalGd.scoreDocs, groupValue, mvalGd.groupSortValues));
+ BytesRef groupValue =
+ mvalGd.groupValue.exists() ? ((MutableValueStr) mvalGd.groupValue).value.get() : null;
+ groups.add(
+ new GroupDocs<>(
+ Float.NaN,
+ mvalGd.maxScore,
+ mvalGd.totalHits,
+ mvalGd.scoreDocs,
+ groupValue,
+ mvalGd.groupSortValues));
}
- // NOTE: currenlty using diamond operator on MergedIterator (without explicit Term class) causes
+ // NOTE: currenlty using diamond operator on MergedIterator (without explicit Term class)
+ // causes
// errors on Eclipse Compiler (ecj) used for javadoc lint
- return new TopGroups<BytesRef>(mvalTopGroups.groupSort, mvalTopGroups.withinGroupSort, mvalTopGroups.totalHitCount, mvalTopGroups.totalGroupedHitCount, groups.toArray(new GroupDocs[groups.size()]), Float.NaN);
+ return new TopGroups<BytesRef>(
+ mvalTopGroups.groupSort,
+ mvalTopGroups.withinGroupSort,
+ mvalTopGroups.totalHitCount,
+ mvalTopGroups.totalGroupedHitCount,
+ groups.toArray(new GroupDocs[groups.size()]),
+ Float.NaN);
}
fail();
return null;
@@ -377,7 +426,7 @@ public class TestGrouping extends LuceneTestCase {
return new Comparator<GroupDoc>() {
@Override
public int compare(GroupDoc d1, GroupDoc d2) {
- for(SortField sf : sortFields) {
+ for (SortField sf : sortFields) {
final int cmp;
if (sf.getType() == SortField.Type.SCORE) {
if (d1.score > d2.score) {
@@ -406,11 +455,11 @@ public class TestGrouping extends LuceneTestCase {
};
}
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
private Comparable<?>[] fillFields(GroupDoc d, Sort sort) {
final SortField[] sortFields = sort.getSort();
final Comparable<?>[] fields = new Comparable[sortFields.length];
- for(int fieldIDX=0;fieldIDX<sortFields.length;fieldIDX++) {
+ for (int fieldIDX = 0; fieldIDX < sortFields.length; fieldIDX++) {
final Comparable<?> c;
final SortField sf = sortFields[fieldIDX];
if (sf.getType() == SortField.Type.SCORE) {
@@ -436,46 +485,47 @@ public class TestGrouping extends LuceneTestCase {
}
}
- private TopGroups<BytesRef> slowGrouping(GroupDoc[] groupDocs,
- String searchTerm,
- boolean getMaxScores,
- boolean doAllGroups,
- Sort groupSort,
- Sort docSort,
- int topNGroups,
- int docsPerGroup,
- int groupOffset,
- int docOffset) {
+ private TopGroups<BytesRef> slowGrouping(
+ GroupDoc[] groupDocs,
+ String searchTerm,
+ boolean getMaxScores,
+ boolean doAllGroups,
+ Sort groupSort,
+ Sort docSort,
+ int topNGroups,
+ int docsPerGroup,
+ int groupOffset,
+ int docOffset) {
final Comparator<GroupDoc> groupSortComp = getComparator(groupSort);
Arrays.sort(groupDocs, groupSortComp);
- final HashMap<BytesRef,List<GroupDoc>> groups = new HashMap<>();
+ final HashMap<BytesRef, List<GroupDoc>> groups = new HashMap<>();
final List<BytesRef> sortedGroups = new ArrayList<>();
final List<Comparable<?>[]> sortedGroupFields = new ArrayList<>();
int totalHitCount = 0;
Set<BytesRef> knownGroups = new HashSet<>();
- //System.out.println("TEST: slowGrouping");
- for(GroupDoc d : groupDocs) {
+ // System.out.println("TEST: slowGrouping");
+ for (GroupDoc d : groupDocs) {
// TODO: would be better to filter by searchTerm before sorting!
if (!d.content.startsWith(searchTerm)) {
continue;
}
totalHitCount++;
- //System.out.println(" match id=" + d.id + " score=" + d.score);
+ // System.out.println(" match id=" + d.id + " score=" + d.score);
if (doAllGroups) {
if (!knownGroups.contains(d.group)) {
knownGroups.add(d.group);
- //System.out.println(" add group=" + groupToString(d.group));
+ // System.out.println(" add group=" + groupToString(d.group));
}
}
List<GroupDoc> l = groups.get(d.group);
if (l == null) {
- //System.out.println(" add sortedGroup=" + groupToString(d.group));
+ // System.out.println(" add sortedGroup=" + groupToString(d.group));
sortedGroups.add(d.group);
sortedGroupFields.add(fillFields(d, groupSort));
l = new ArrayList<>();
@@ -492,10 +542,10 @@ public class TestGrouping extends LuceneTestCase {
final int limit = Math.min(groupOffset + topNGroups, groups.size());
final Comparator<GroupDoc> docSortComp = getComparator(docSort);
- @SuppressWarnings({"unchecked","rawtypes"})
- final GroupDocs<BytesRef>[] result = new GroupDocs[limit-groupOffset];
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ final GroupDocs<BytesRef>[] result = new GroupDocs[limit - groupOffset];
int totalGroupedHitCount = 0;
- for(int idx=groupOffset;idx < limit;idx++) {
+ for (int idx = groupOffset; idx < limit; idx++) {
final BytesRef group = sortedGroups.get(idx);
final List<GroupDoc> docs = groups.get(group);
totalGroupedHitCount += docs.size();
@@ -504,41 +554,55 @@ public class TestGrouping extends LuceneTestCase {
if (docs.size() > docOffset) {
final int docIDXLimit = Math.min(docOffset + docsPerGroup, docs.size());
hits = new ScoreDoc[docIDXLimit - docOffset];
- for(int docIDX=docOffset; docIDX < docIDXLimit; docIDX++) {
+ for (int docIDX = docOffset; docIDX < docIDXLimit; docIDX++) {
final GroupDoc d = docs.get(docIDX);
final FieldDoc fd;
fd = new FieldDoc(d.id, Float.NaN, fillFields(d, docSort));
- hits[docIDX-docOffset] = fd;
+ hits[docIDX - docOffset] = fd;
}
- } else {
+ } else {
hits = new ScoreDoc[0];
}
- result[idx-groupOffset] = new GroupDocs<>(Float.NaN,
- 0.0f,
- new TotalHits(docs.size(), TotalHits.Relation.EQUAL_TO),
- hits,
- group,
- sortedGroupFields.get(idx));
+ result[idx - groupOffset] =
+ new GroupDocs<>(
+ Float.NaN,
+ 0.0f,
+ new TotalHits(docs.size(), TotalHits.Relation.EQUAL_TO),
+ hits,
+ group,
+ sortedGroupFields.get(idx));
}
if (doAllGroups) {
return new TopGroups<>(
- new TopGroups<>(groupSort.getSort(), docSort.getSort(), totalHitCount, totalGroupedHitCount, result, Float.NaN),
- knownGroups.size()
- );
+ new TopGroups<>(
+ groupSort.getSort(),
+ docSort.getSort(),
+ totalHitCount,
+ totalGroupedHitCount,
+ result,
+ Float.NaN),
+ knownGroups.size());
} else {
- return new TopGroups<>(groupSort.getSort(), docSort.getSort(), totalHitCount, totalGroupedHitCount, result, Float.NaN);
+ return new TopGroups<>(
+ groupSort.getSort(),
+ docSort.getSort(),
+ totalHitCount,
+ totalGroupedHitCount,
+ result,
+ Float.NaN);
}
}
- private DirectoryReader getDocBlockReader(Directory dir, GroupDoc[] groupDocs) throws IOException {
+ private DirectoryReader getDocBlockReader(Directory dir, GroupDoc[] groupDocs)
+ throws IOException {
// Coalesce by group, but in random order:
Collections.shuffle(Arrays.asList(groupDocs), random());
- final Map<BytesRef,List<GroupDoc>> groupMap = new HashMap<>();
+ final Map<BytesRef, List<GroupDoc>> groupMap = new HashMap<>();
final List<BytesRef> groupValues = new ArrayList<>();
- for(GroupDoc groupDoc : groupDocs) {
+ for (GroupDoc groupDoc : groupDocs) {
if (!groupMap.containsKey(groupDoc.group)) {
groupValues.add(groupDoc.group);
groupMap.put(groupDoc.group, new ArrayList<GroupDoc>());
@@ -546,10 +610,8 @@ public class TestGrouping extends LuceneTestCase {
groupMap.get(groupDoc.group).add(groupDoc);
}
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())));
+ RandomIndexWriter w =
+ new RandomIndexWriter(random(), dir, newIndexWriterConfig(new MockAnalyzer(random())));
final List<List<Document>> updateDocs = new ArrayList<>();
@@ -557,11 +619,11 @@ public class TestGrouping extends LuceneTestCase {
groupEndType.setIndexOptions(IndexOptions.DOCS);
groupEndType.setOmitNorms(true);
- //System.out.println("TEST: index groups");
- for(BytesRef group : groupValues) {
+ // System.out.println("TEST: index groups");
+ for (BytesRef group : groupValues) {
final List<Document> docs = new ArrayList<>();
- //System.out.println("TEST: group=" + (group == null ? "null" : group.utf8ToString()));
- for(GroupDoc groupValue : groupMap.get(group)) {
+ // System.out.println("TEST: group=" + (group == null ? "null" : group.utf8ToString()));
+ for (GroupDoc groupValue : groupMap.get(group)) {
Document doc = new Document();
docs.add(doc);
if (groupValue.group != null) {
@@ -574,11 +636,13 @@ public class TestGrouping extends LuceneTestCase {
doc.add(new SortedDocValuesField("sort2", BytesRef.deepCopyOf(groupValue.sort2)));
doc.add(new NumericDocValuesField("id", groupValue.id));
doc.add(newTextField("content", groupValue.content, Field.Store.NO));
- //System.out.println("TEST: doc content=" + groupValue.content + " group=" + (groupValue.group == null ? "null" : groupValue.group.utf8ToString()) + " sort1=" + groupValue.sort1.utf8ToString() + " id=" + groupValue.id);
+ // System.out.println("TEST: doc content=" + groupValue.content + " group=" +
+ // (groupValue.group == null ? "null" : groupValue.group.utf8ToString()) + " sort1=" +
+ // groupValue.sort1.utf8ToString() + " id=" + groupValue.id);
}
// So we can pull filter marking last doc in block:
final Field groupEnd = newField("groupend", "x", groupEndType);
- docs.get(docs.size()-1).add(groupEnd);
+ docs.get(docs.size() - 1).add(groupEnd);
// Add as a doc block:
w.addDocuments(docs);
if (group != null && random().nextInt(7) == 4) {
@@ -586,7 +650,7 @@ public class TestGrouping extends LuceneTestCase {
}
}
- for(List<Document> docs : updateDocs) {
+ for (List<Document> docs : updateDocs) {
// Just replaces docs w/ same docs:
w.updateDocuments(new Term("group", docs.get(0).get("group")), docs);
}
@@ -606,27 +670,27 @@ public class TestGrouping extends LuceneTestCase {
final IndexReaderContext ctx = s.getTopReaderContext();
final List<LeafReaderContext> leaves = ctx.leaves();
subSearchers = new ShardSearcher[leaves.size()];
- for(int searcherIDX=0;searcherIDX<subSearchers.length;searcherIDX++) {
+ for (int searcherIDX = 0; searcherIDX < subSearchers.length; searcherIDX++) {
subSearchers[searcherIDX] = new ShardSearcher(leaves.get(searcherIDX), ctx);
}
docStarts = new int[subSearchers.length];
- for(int subIDX=0;subIDX<docStarts.length;subIDX++) {
+ for (int subIDX = 0; subIDX < docStarts.length; subIDX++) {
docStarts[subIDX] = leaves.get(subIDX).docBase;
- //System.out.println("docStarts[" + subIDX + "]=" + docStarts[subIDX]);
+ // System.out.println("docStarts[" + subIDX + "]=" + docStarts[subIDX]);
}
}
}
public void testRandom() throws Exception {
int numberOfRuns = atLeast(1);
- for (int iter=0; iter<numberOfRuns; iter++) {
+ for (int iter = 0; iter < numberOfRuns; iter++) {
if (VERBOSE) {
System.out.println("TEST: iter=" + iter);
}
final int numDocs = atLeast(100);
- //final int numDocs = _TestUtil.nextInt(random, 5, 20);
+ // final int numDocs = _TestUtil.nextInt(random, 5, 20);
final int numGroups = TestUtil.nextInt(random(), 1, numDocs);
@@ -635,14 +699,15 @@ public class TestGrouping extends LuceneTestCase {
}
final List<BytesRef> groups = new ArrayList<>();
- for(int i=0;i<numGroups;i++) {
+ for (int i = 0; i < numGroups; i++) {
String randomValue;
do {
- // B/c of DV based impl we can't see the difference between an empty string and a null value.
+ // B/c of DV based impl we can't see the difference between an empty string and a null
+ // value.
// For that reason we don't generate empty string
// groups.
randomValue = TestUtil.randomRealisticUnicodeString(random());
- //randomValue = TestUtil.randomSimpleString(random());
+ // randomValue = TestUtil.randomSimpleString(random());
} while ("".equals(randomValue));
groups.add(new BytesRef(randomValue));
@@ -651,11 +716,11 @@ public class TestGrouping extends LuceneTestCase {
if (VERBOSE) {
System.out.println("TEST: create fake content");
}
- for(int contentIDX=0;contentIDX<contentStrings.length;contentIDX++) {
+ for (int contentIDX = 0; contentIDX < contentStrings.length; contentIDX++) {
final StringBuilder sb = new StringBuilder();
sb.append("real").append(random().nextInt(3)).append(' ');
final int fakeCount = random().nextInt(10);
- for(int fakeIDX=0;fakeIDX<fakeCount;fakeIDX++) {
+ for (int fakeIDX = 0; fakeIDX < fakeCount; fakeIDX++) {
sb.append("fake ");
}
contentStrings[contentIDX] = sb.toString();
@@ -665,10 +730,8 @@ public class TestGrouping extends LuceneTestCase {
}
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())));
+ RandomIndexWriter w =
+ new RandomIndexWriter(random(), dir, newIndexWriterConfig(new MockAnalyzer(random())));
Document doc = new Document();
Document docNoGroup = new Document();
Field idvGroupField = new SortedDocValuesField("group", new BytesRef());
@@ -690,7 +753,7 @@ public class TestGrouping extends LuceneTestCase {
doc.add(idDV);
docNoGroup.add(idDV);
final GroupDoc[] groupDocs = new GroupDoc[numDocs];
- for(int i=0;i<numDocs;i++) {
+ for (int i = 0; i < numDocs; i++) {
final BytesRef groupValue;
if (random().nextInt(24) == 17) {
// So we test the "doc doesn't have the group'd
@@ -699,13 +762,25 @@ public class TestGrouping extends LuceneTestCase {
} else {
groupValue = groups.get(random().nextInt(groups.size()));
}
- final GroupDoc groupDoc = new GroupDoc(i,
- groupValue,
- groups.get(random().nextInt(groups.size())),
- groups.get(random().nextInt(groups.size())),
- contentStrings[random().nextInt(contentStrings.length)]);
+ final GroupDoc groupDoc =
+ new GroupDoc(
+ i,
+ groupValue,
+ groups.get(random().nextInt(groups.size())),
+ groups.get(random().nextInt(groups.size())),
+ contentStrings[random().nextInt(contentStrings.length)]);
if (VERBOSE) {
- System.out.println(" doc content=" + groupDoc.content + " id=" + i + " group=" + (groupDoc.group == null ? "null" : groupDoc.group.utf8ToString()) + " sort1=" + groupDoc.sort1.utf8ToString() + " sort2=" + groupDoc.sort2.utf8ToString());
+ System.out.println(
+ " doc content="
+ + groupDoc.content
+ + " id="
+ + i
+ + " group="
+ + (groupDoc.group == null ? "null" : groupDoc.group.utf8ToString())
+ + " sort1="
+ + groupDoc.sort1.utf8ToString()
+ + " sort2="
+ + groupDoc.sort2.utf8ToString());
}
groupDocs[i] = groupDoc;
@@ -735,10 +810,10 @@ public class TestGrouping extends LuceneTestCase {
final DirectoryReader r = w.getReader();
w.close();
-
+
NumericDocValues values = MultiDocValues.getNumericValues(r, "id");
int[] docIDToID = new int[r.maxDoc()];
- for(int i=0;i<r.maxDoc();i++) {
+ for (int i = 0; i < r.maxDoc(); i++) {
assertEquals(i, values.nextDoc());
docIDToID[i] = (int) values.longValue();
}
@@ -752,13 +827,14 @@ public class TestGrouping extends LuceneTestCase {
if (VERBOSE) {
System.out.println("\nTEST: searcher=" + s);
}
-
+
final ShardState shards = new ShardState(s);
-
+
Set<Integer> seenIDs = new HashSet<>();
- for(int contentID=0;contentID<3;contentID++) {
- final ScoreDoc[] hits = s.search(new TermQuery(new Term("content", "real"+contentID)), numDocs).scoreDocs;
- for(ScoreDoc hit : hits) {
+ for (int contentID = 0; contentID < 3; contentID++) {
+ final ScoreDoc[] hits =
+ s.search(new TermQuery(new Term("content", "real" + contentID)), numDocs).scoreDocs;
+ for (ScoreDoc hit : hits) {
int idValue = docIDToID[hit.doc];
final GroupDoc gd = groupDocs[idValue];
@@ -768,111 +844,141 @@ public class TestGrouping extends LuceneTestCase {
assertEquals(gd.id, idValue);
}
}
-
+
// make sure all groups were seen across the hits
assertEquals(groupDocs.length, seenIDs.size());
- for(GroupDoc gd : groupDocs) {
+ for (GroupDoc gd : groupDocs) {
assertTrue(Float.isFinite(gd.score));
assertTrue(gd.score >= 0.0);
}
-
+
// Build 2nd index, where docs are added in blocks by
// group, so we can use single pass collector
dirBlocks = newDirectory();
rBlocks = getDocBlockReader(dirBlocks, groupDocs);
final Query lastDocInBlock = new TermQuery(new Term("groupend", "x"));
-
+
final IndexSearcher sBlocks = newSearcher(rBlocks);
// This test relies on the fact that longer fields produce lower scores
sBlocks.setSimilarity(new BM25Similarity());
final ShardState shardsBlocks = new ShardState(sBlocks);
-
+
// ReaderBlocks only increases maxDoc() vs reader, which
// means a monotonic shift in scores, so we can
// reliably remap them w/ Map:
- final Map<String,Map<Float,Float>> scoreMap = new HashMap<>();
+ final Map<String, Map<Float, Float>> scoreMap = new HashMap<>();
values = MultiDocValues.getNumericValues(rBlocks, "id");
assertNotNull(values);
int[] docIDToIDBlocks = new int[rBlocks.maxDoc()];
- for(int i=0;i<rBlocks.maxDoc();i++) {
+ for (int i = 0; i < rBlocks.maxDoc(); i++) {
assertEquals(i, values.nextDoc());
docIDToIDBlocks[i] = (int) values.longValue();
}
-
+
// Tricky: must separately set .score2, because the doc
// block index was created with possible deletions!
- //System.out.println("fixup score2");
- for(int contentID=0;contentID<3;contentID++) {
- //System.out.println(" term=real" + contentID);
- final Map<Float,Float> termScoreMap = new HashMap<>();
- scoreMap.put("real"+contentID, termScoreMap);
- //System.out.println("term=real" + contentID + " dfold=" + s.docFreq(new Term("content", "real"+contentID)) +
- //" dfnew=" + sBlocks.docFreq(new Term("content", "real"+contentID)));
- final ScoreDoc[] hits = sBlocks.search(new TermQuery(new Term("content", "real"+contentID)), numDocs).scoreDocs;
- for(ScoreDoc hit : hits) {
+ // System.out.println("fixup score2");
+ for (int contentID = 0; contentID < 3; contentID++) {
+ // System.out.println(" term=real" + contentID);
+ final Map<Float, Float> termScoreMap = new HashMap<>();
+ scoreMap.put("real" + contentID, termScoreMap);
+ // System.out.println("term=real" + contentID + " dfold=" + s.docFreq(new Term("content",
+ // "real"+contentID)) +
+ // " dfnew=" + sBlocks.docFreq(new Term("content", "real"+contentID)));
+ final ScoreDoc[] hits =
+ sBlocks.search(new TermQuery(new Term("content", "real" + contentID)), numDocs)
+ .scoreDocs;
+ for (ScoreDoc hit : hits) {
final GroupDoc gd = groupDocsByID[docIDToIDBlocks[hit.doc]];
assertTrue(gd.score2 == 0.0);
gd.score2 = hit.score;
assertEquals(gd.id, docIDToIDBlocks[hit.doc]);
- //System.out.println(" score=" + gd.score + " score2=" + hit.score + " id=" + docIDToIDBlocks[hit.doc]);
+ // System.out.println(" score=" + gd.score + " score2=" + hit.score + " id=" +
+ // docIDToIDBlocks[hit.doc]);
termScoreMap.put(gd.score, gd.score2);
}
}
-
- for(int searchIter=0;searchIter<100;searchIter++) {
-
+
+ for (int searchIter = 0; searchIter < 100; searchIter++) {
+
if (VERBOSE) {
System.out.println("\nTEST: searchIter=" + searchIter);
}
-
+
final String searchTerm = "real" + random().nextInt(3);
final boolean getMaxScores = random().nextBoolean();
final Sort groupSort = getRandomSort();
- //final Sort groupSort = new Sort(new SortField[] {new SortField("sort1", SortField.STRING), new SortField("id", SortField.INT)});
+ // final Sort groupSort = new Sort(new SortField[] {new SortField("sort1",
+ // SortField.STRING), new SortField("id", SortField.INT)});
final Sort docSort = getRandomSort();
-
+
final int topNGroups = TestUtil.nextInt(random(), 1, 30);
- //final int topNGroups = 10;
+ // final int topNGroups = 10;
final int docsPerGroup = TestUtil.nextInt(random(), 1, 50);
-
+
final int groupOffset = TestUtil.nextInt(random(), 0, (topNGroups - 1) / 2);
- //final int groupOffset = 0;
-
+ // final int groupOffset = 0;
+
final int docOffset = TestUtil.nextInt(random(), 0, docsPerGroup - 1);
- //final int docOffset = 0;
+ // final int docOffset = 0;
final boolean doCache = random().nextBoolean();
final boolean doAllGroups = random().nextBoolean();
if (VERBOSE) {
- System.out.println("TEST: groupSort=" + groupSort + " docSort=" + docSort + " searchTerm=" + searchTerm + " dF=" + r.docFreq(new Term("content", searchTerm)) +" dFBlock=" + rBlocks.docFreq(new Term("content", searchTerm)) + " topNGroups=" + topNGroups + " groupOffset=" + groupOffset + " docOffset=" + docOffset + " doCache=" + doCache + " docsPerGroup=" + docsPerGroup + " doAllGroups=" + doAllGroups + " getMaxScores=" + getMaxScores);
+ System.out.println(
+ "TEST: groupSort="
+ + groupSort
+ + " docSort="
+ + docSort
+ + " searchTerm="
+ + searchTerm
+ + " dF="
+ + r.docFreq(new Term("content", searchTerm))
+ + " dFBlock="
+ + rBlocks.docFreq(new Term("content", searchTerm))
+ + " topNGroups="
+ + topNGroups
+ + " groupOffset="
+ + groupOffset
+ + " docOffset="
+ + docOffset
+ + " doCache="
+ + doCache
+ + " docsPerGroup="
+ + docsPerGroup
+ + " doAllGroups="
+ + doAllGroups
+ + " getMaxScores="
+ + getMaxScores);
}
-
+
String groupField = "group";
if (VERBOSE) {
System.out.println(" groupField=" + groupField);
}
- final FirstPassGroupingCollector<?> c1 = createRandomFirstPassCollector(groupField, groupSort, groupOffset+topNGroups);
+ final FirstPassGroupingCollector<?> c1 =
+ createRandomFirstPassCollector(groupField, groupSort, groupOffset + topNGroups);
final CachingCollector cCache;
final Collector c;
-
+
final AllGroupsCollector<?> allGroupsCollector;
if (doAllGroups) {
allGroupsCollector = createAllGroupsCollector(c1, groupField);
} else {
allGroupsCollector = null;
}
-
+
final boolean useWrappingCollector = random().nextBoolean();
-
+
if (doCache) {
final double maxCacheMB = random().nextDouble();
if (VERBOSE) {
System.out.println("TEST: maxCacheMB=" + maxCacheMB);
}
-
+
if (useWrappingCollector) {
if (doAllGroups) {
cCache = CachingCollector.create(c1, true, maxCacheMB);
@@ -892,12 +998,12 @@ public class TestGrouping extends LuceneTestCase {
c = c1;
}
}
-
+
// Search top reader:
final Query query = new TermQuery(new Term("content", searchTerm));
-
+
s.search(query, c);
-
+
if (doCache && !useWrappingCollector) {
if (cCache.isCached()) {
// Replay for first-pass grouping
@@ -914,7 +1020,7 @@ public class TestGrouping extends LuceneTestCase {
}
}
}
-
+
// Get 1st pass top groups
final Collection<SearchGroup<BytesRef>> topGroups = getSearchGroups(c1, groupOffset);
final TopGroups<BytesRef> groupsResult;
@@ -924,26 +1030,50 @@ public class TestGrouping extends LuceneTestCase {
System.out.println(" null");
} else {
for (SearchGroup<BytesRef> searchGroup : topGroups) {
- System.out.println(" " + (searchGroup.groupValue == null ? "null" : searchGroup.groupValue) + ": " + Arrays.deepToString(searchGroup.sortValues));
+ System.out.println(
+ " "
+ + (searchGroup.groupValue == null ? "null" : searchGroup.groupValue)
+ + ": "
+ + Arrays.deepToString(searchGroup.sortValues));
}
}
}
-
+
// Get 1st pass top groups using shards
-
- final TopGroups<BytesRef> topGroupsShards = searchShards(s, shards.subSearchers, query, groupSort, docSort,
- groupOffset, topNGroups, docOffset, docsPerGroup, getMaxScores, true, true);
+
+ final TopGroups<BytesRef> topGroupsShards =
+ searchShards(
+ s,
+ shards.subSearchers,
+ query,
+ groupSort,
+ docSort,
+ groupOffset,
+ topNGroups,
+ docOffset,
+ docsPerGroup,
+ getMaxScores,
+ true,
+ true);
final TopGroupsCollector<?> c2;
if (topGroups != null) {
-
+
if (VERBOSE) {
System.out.println("TEST: topGroups");
for (SearchGroup<BytesRef> searchGroup : topGroups) {
- System.out.println(" " + (searchGroup.groupValue == null ? "null" : searchGroup.groupValue.utf8ToString()) + ": " + Arrays.deepToString(searchGroup.sortValues));
+ System.out.println(
+ " "
+ + (searchGroup.groupValue == null
+ ? "null"
+ : searchGroup.groupValue.utf8ToString())
+ + ": "
+ + Arrays.deepToString(searchGroup.sortValues));
}
}
-
- c2 = createSecondPassCollector(c1, groupSort, docSort, groupOffset, docOffset + docsPerGroup, getMaxScores);
+
+ c2 =
+ createSecondPassCollector(
+ c1, groupSort, docSort, groupOffset, docOffset + docsPerGroup, getMaxScores);
if (doCache) {
if (cCache.isCached()) {
if (VERBOSE) {
@@ -959,7 +1089,7 @@ public class TestGrouping extends LuceneTestCase {
} else {
s.search(query, c2);
}
-
+
if (doAllGroups) {
TopGroups<BytesRef> tempTopGroups = getTopGroups(c2, docOffset);
groupsResult = new TopGroups<>(tempTopGroups, allGroupsCollector.getGroupCount());
@@ -973,63 +1103,99 @@ public class TestGrouping extends LuceneTestCase {
System.out.println("TEST: no results");
}
}
-
- final TopGroups<BytesRef> expectedGroups = slowGrouping(groupDocs, searchTerm, getMaxScores, doAllGroups, groupSort, docSort, topNGroups, docsPerGroup, groupOffset, docOffset);
-
+
+ final TopGroups<BytesRef> expectedGroups =
+ slowGrouping(
+ groupDocs,
+ searchTerm,
+ getMaxScores,
+ doAllGroups,
+ groupSort,
+ docSort,
+ topNGroups,
+ docsPerGroup,
+ groupOffset,
+ docOffset);
+
if (VERBOSE) {
if (expectedGroups == null) {
System.out.println("TEST: no expected groups");
} else {
- System.out.println("TEST: expected groups totalGroupedHitCount=" + expectedGroups.totalGroupedHitCount);
- for(GroupDocs<BytesRef> gd : expectedGroups.groups) {
- System.out.println(" group=" + (gd.groupValue == null ? "null" : gd.groupValue) + " totalHits=" + gd.totalHits.value + " scoreDocs.len=" + gd.scoreDocs.length);
- for(ScoreDoc sd : gd.scoreDocs) {
+ System.out.println(
+ "TEST: expected groups totalGroupedHitCount="
+ + expectedGroups.totalGroupedHitCount);
+ for (GroupDocs<BytesRef> gd : expectedGroups.groups) {
+ System.out.println(
+ " group="
+ + (gd.groupValue == null ? "null" : gd.groupValue)
+ + " totalHits="
+ + gd.totalHits.value
+ + " scoreDocs.len="
+ + gd.scoreDocs.length);
+ for (ScoreDoc sd : gd.scoreDocs) {
System.out.println(" id=" + sd.doc + " score=" + sd.score);
}
}
}
-
+
if (groupsResult == null) {
System.out.println("TEST: no matched groups");
} else {
- System.out.println("TEST: matched groups totalGroupedHitCount=" + groupsResult.totalGroupedHitCount);
- for(GroupDocs<BytesRef> gd : groupsResult.groups) {
- System.out.println(" group=" + (gd.groupValue == null ? "null" : gd.groupValue) + " totalHits=" + gd.totalHits.value);
- for(ScoreDoc sd : gd.scoreDocs) {
+ System.out.println(
+ "TEST: matched groups totalGroupedHitCount=" + groupsResult.totalGroupedHitCount);
+ for (GroupDocs<BytesRef> gd : groupsResult.groups) {
+ System.out.println(
+ " group="
+ + (gd.groupValue == null ? "null" : gd.groupValue)
+ + " totalHits="
+ + gd.totalHits.value);
+ for (ScoreDoc sd : gd.scoreDocs) {
System.out.println(" id=" + docIDToID[sd.doc] + " score=" + sd.score);
}
}
-
+
if (searchIter == 14) {
- for(int docIDX=0;docIDX<s.getIndexReader().maxDoc();docIDX++) {
- System.out.println("ID=" + docIDToID[docIDX] + " explain=" + s.explain(query, docIDX));
+ for (int docIDX = 0; docIDX < s.getIndexReader().maxDoc(); docIDX++) {
+ System.out.println(
+ "ID=" + docIDToID[docIDX] + " explain=" + s.explain(query, docIDX));
}
}
}
-
+
if (topGroupsShards == null) {
System.out.println("TEST: no matched-merged groups");
} else {
- System.out.println("TEST: matched-merged groups totalGroupedHitCount=" + topGroupsShards.totalGroupedHitCount);
- for(GroupDocs<BytesRef> gd : topGroupsShards.groups) {
- System.out.println(" group=" + (gd.groupValue == null ? "null" : gd.groupValue) + " totalHits=" + gd.totalHits.value);
- for(ScoreDoc sd : gd.scoreDocs) {
+ System.out.println(
+ "TEST: matched-merged groups totalGroupedHitCount="
+ + topGroupsShards.totalGroupedHitCount);
+ for (GroupDocs<BytesRef> gd : topGroupsShards.groups) {
+ System.out.println(
+ " group="
+ + (gd.groupValue == null ? "null" : gd.groupValue)
+ + " totalHits="
+ + gd.totalHits.value);
+ for (ScoreDoc sd : gd.scoreDocs) {
System.out.println(" id=" + docIDToID[sd.doc] + " score=" + sd.score);
}
}
}
}
-
+
assertEquals(docIDToID, expectedGroups, groupsResult, true, true, true);
-
+
// Confirm merged shards match:
assertEquals(docIDToID, expectedGroups, topGroupsShards, true, false, true);
if (topGroupsShards != null) {
verifyShards(shards.docStarts, topGroupsShards);
}
- final BlockGroupingCollector c3 = new BlockGroupingCollector(groupSort, groupOffset+topNGroups,
- groupSort.needsScores() || docSort.needsScores(), sBlocks.createWeight(sBlocks.rewrite(lastDocInBlock), ScoreMode.COMPLETE_NO_SCORES, 1));
+ final BlockGroupingCollector c3 =
+ new BlockGroupingCollector(
+ groupSort,
+ groupOffset + topNGroups,
+ groupSort.needsScores() || docSort.needsScores(),
+ sBlocks.createWeight(
+ sBlocks.rewrite(lastDocInBlock), ScoreMode.COMPLETE_NO_SCORES, 1));
final AllGroupsCollector<BytesRef> allGroupsCollector2;
final Collector c4;
if (doAllGroups) {
@@ -1044,25 +1210,35 @@ public class TestGrouping extends LuceneTestCase {
}
// Get block grouping result:
sBlocks.search(query, c4);
- @SuppressWarnings({"unchecked","rawtypes"})
- final TopGroups<BytesRef> tempTopGroupsBlocks = (TopGroups<BytesRef>) c3.getTopGroups(docSort, groupOffset, docOffset, docOffset+docsPerGroup);
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ final TopGroups<BytesRef> tempTopGroupsBlocks =
+ (TopGroups<BytesRef>)
+ c3.getTopGroups(docSort, groupOffset, docOffset, docOffset + docsPerGroup);
final TopGroups<BytesRef> groupsResultBlocks;
if (doAllGroups && tempTopGroupsBlocks != null) {
- assertEquals((int) tempTopGroupsBlocks.totalGroupCount, allGroupsCollector2.getGroupCount());
- groupsResultBlocks = new TopGroups<>(tempTopGroupsBlocks, allGroupsCollector2.getGroupCount());
+ assertEquals(
+ (int) tempTopGroupsBlocks.totalGroupCount, allGroupsCollector2.getGroupCount());
+ groupsResultBlocks =
+ new TopGroups<>(tempTopGroupsBlocks, allGroupsCollector2.getGroupCount());
} else {
groupsResultBlocks = tempTopGroupsBlocks;
}
-
+
if (VERBOSE) {
if (groupsResultBlocks == null) {
System.out.println("TEST: no block groups");
} else {
- System.out.println("TEST: block groups totalGroupedHitCount=" + groupsResultBlocks.totalGroupedHitCount);
+ System.out.println(
+ "TEST: block groups totalGroupedHitCount="
+ + groupsResultBlocks.totalGroupedHitCount);
boolean first = true;
- for(GroupDocs<BytesRef> gd : groupsResultBlocks.groups) {
- System.out.println(" group=" + (gd.groupValue == null ? "null" : gd.groupValue.utf8ToString()) + " totalHits=" + gd.totalHits.value);
- for(ScoreDoc sd : gd.scoreDocs) {
+ for (GroupDocs<BytesRef> gd : groupsResultBlocks.groups) {
+ System.out.println(
+ " group="
+ + (gd.groupValue == null ? "null" : gd.groupValue.utf8ToString())
+ + " totalHits="
+ + gd.totalHits.value);
+ for (ScoreDoc sd : gd.scoreDocs) {
System.out.println(" id=" + docIDToIDBlocks[sd.doc] + " score=" + sd.score);
if (first) {
System.out.println("explain: " + sBlocks.explain(query, sd.doc));
@@ -1072,41 +1248,56 @@ public class TestGrouping extends LuceneTestCase {
}
}
}
-
+
// Get shard'd block grouping result:
- final TopGroups<BytesRef> topGroupsBlockShards = searchShards(sBlocks, shardsBlocks.subSearchers, query,
- groupSort, docSort, groupOffset, topNGroups, docOffset, docsPerGroup, getMaxScores, false, false);
-
+ final TopGroups<BytesRef> topGroupsBlockShards =
+ searchShards(
+ sBlocks,
+ shardsBlocks.subSearchers,
+ query,
+ groupSort,
+ docSort,
+ groupOffset,
+ topNGroups,
+ docOffset,
+ docsPerGroup,
+ getMaxScores,
+ false,
+ false);
+
if (expectedGroups != null) {
// Fixup scores for reader2
for (GroupDocs<?> groupDocsHits : expectedGroups.groups) {
- for(ScoreDoc hit : groupDocsHits.scoreDocs) {
+ for (ScoreDoc hit : groupDocsHits.scoreDocs) {
final GroupDoc gd = groupDocsByID[hit.doc];
assertEquals(gd.id, hit.doc);
- //System.out.println("fixup score " + hit.score + " to " + gd.score2 + " vs " + gd.score);
+ // System.out.println("fixup score " + hit.score + " to " + gd.score2 + " vs " +
+ // gd.score);
hit.score = gd.score2;
}
}
-
+
final SortField[] sortFields = groupSort.getSort();
- final Map<Float,Float> termScoreMap = scoreMap.get(searchTerm);
- for(int groupSortIDX=0;groupSortIDX<sortFields.length;groupSortIDX++) {
+ final Map<Float, Float> termScoreMap = scoreMap.get(searchTerm);
+ for (int groupSortIDX = 0; groupSortIDX < sortFields.length; groupSortIDX++) {
if (sortFields[groupSortIDX].getType() == SortField.Type.SCORE) {
for (GroupDocs<?> groupDocsHits : expectedGroups.groups) {
if (groupDocsHits.groupSortValues != null) {
- //System.out.println("remap " + groupDocsHits.groupSortValues[groupSortIDX] + " to " + termScoreMap.get(groupDocsHits.groupSortValues[groupSortIDX]));
- groupDocsHits.groupSortValues[groupSortIDX] = termScoreMap.get(groupDocsHits.groupSortValues[groupSortIDX]);
+ // System.out.println("remap " + groupDocsHits.groupSortValues[groupSortIDX] + "
+ // to " + termScoreMap.get(groupDocsHits.groupSortValues[groupSortIDX]));
+ groupDocsHits.groupSortValues[groupSortIDX] =
+ termScoreMap.get(groupDocsHits.groupSortValues[groupSortIDX]);
assertNotNull(groupDocsHits.groupSortValues[groupSortIDX]);
}
}
}
}
-
+
final SortField[] docSortFields = docSort.getSort();
- for(int docSortIDX=0;docSortIDX<docSortFields.length;docSortIDX++) {
+ for (int docSortIDX = 0; docSortIDX < docSortFields.length; docSortIDX++) {
if (docSortFields[docSortIDX].getType() == SortField.Type.SCORE) {
for (GroupDocs<?> groupDocsHits : expectedGroups.groups) {
- for(ScoreDoc _hit : groupDocsHits.scoreDocs) {
+ for (ScoreDoc _hit : groupDocsHits.scoreDocs) {
FieldDoc hit = (FieldDoc) _hit;
if (hit.fields != null) {
hit.fields[docSortIDX] = termScoreMap.get(hit.fields[docSortIDX]);
@@ -1117,40 +1308,66 @@ public class TestGrouping extends LuceneTestCase {
}
}
}
-
+
assertEquals(docIDToIDBlocks, expectedGroups, groupsResultBlocks, false, true, false);
assertEquals(docIDToIDBlocks, expectedGroups, topGroupsBlockShards, false, false, false);
}
-
+
r.close();
dir.close();
-
+
rBlocks.close();
dirBlocks.close();
}
}
private void verifyShards(int[] docStarts, TopGroups<BytesRef> topGroups) {
- for(GroupDocs<?> group : topGroups.groups) {
- for(int hitIDX=0;hitIDX<group.scoreDocs.length;hitIDX++) {
+ for (GroupDocs<?> group : topGroups.groups) {
+ for (int hitIDX = 0; hitIDX < group.scoreDocs.length; hitIDX++) {
final ScoreDoc sd = group.scoreDocs[hitIDX];
- assertEquals("doc=" + sd.doc + " wrong shard",
- ReaderUtil.subIndex(sd.doc, docStarts),
- sd.shardIndex);
+ assertEquals(
+ "doc=" + sd.doc + " wrong shard",
+ ReaderUtil.subIndex(sd.doc, docStarts),
+ sd.shardIndex);
}
}
}
- private TopGroups<BytesRef> searchShards(IndexSearcher topSearcher, ShardSearcher[] subSearchers, Query query, Sort groupSort, Sort docSort, int groupOffset, int topNGroups, int docOffset,
- int topNDocs, boolean getMaxScores, boolean canUseIDV, boolean preFlex) throws Exception {
-
- // TODO: swap in caching, all groups collector hereassertEquals(expected.totalHitCount, actual.totalHitCount);
+ private TopGroups<BytesRef> searchShards(
+ IndexSearcher topSearcher,
+ ShardSearcher[] subSearchers,
+ Query query,
+ Sort groupSort,
+ Sort docSort,
+ int groupOffset,
+ int topNGroups,
+ int docOffset,
+ int topNDocs,
+ boolean getMaxScores,
+ boolean canUseIDV,
+ boolean preFlex)
+ throws Exception {
+
+ // TODO: swap in caching, all groups collector hereassertEquals(expected.totalHitCount,
+ // actual.totalHitCount);
// too...
if (VERBOSE) {
- System.out.println("TEST: " + subSearchers.length + " shards: " + Arrays.toString(subSearchers) + " canUseIDV=" + canUseIDV);
+ System.out.println(
+ "TEST: "
+ + subSearchers.length
+ + " shards: "
+ + Arrays.toString(subSearchers)
+ + " canUseIDV="
+ + canUseIDV);
}
// Run 1st pass collector to get top groups per shard
- final Weight w = topSearcher.createWeight(topSearcher.rewrite(query), groupSort.needsScores() || docSort.needsScores() || getMaxScores ? ScoreMode.COMPLETE : ScoreMode.COMPLETE_NO_SCORES, 1);
+ final Weight w =
+ topSearcher.createWeight(
+ topSearcher.rewrite(query),
+ groupSort.needsScores() || docSort.needsScores() || getMaxScores
+ ? ScoreMode.COMPLETE
+ : ScoreMode.COMPLETE_NO_SCORES,
+ 1);
final List<Collection<SearchGroup<BytesRef>>> shardGroups = new ArrayList<>();
List<FirstPassGroupingCollector<?>> firstPassGroupingCollectors = new ArrayList<>();
FirstPassGroupingCollector<?> firstPassCollector = null;
@@ -1158,14 +1375,17 @@ public class TestGrouping extends LuceneTestCase {
String groupField = "group";
- for(int shardIDX=0;shardIDX<subSearchers.length;shardIDX++) {
+ for (int shardIDX = 0; shardIDX < subSearchers.length; shardIDX++) {
// First shard determines whether we use IDV or not;
// all other shards match that:
if (firstPassCollector == null) {
- firstPassCollector = createRandomFirstPassCollector(groupField, groupSort, groupOffset + topNGroups);
+ firstPassCollector =
+ createRandomFirstPassCollector(groupField, groupSort, groupOffset + topNGroups);
} else {
- firstPassCollector = createFirstPassCollector(groupField, groupSort, groupOffset + topNGroups, firstPassCollector);
+ firstPassCollector =
+ createFirstPassCollector(
+ groupField, groupSort, groupOffset + topNGroups, firstPassCollector);
}
if (VERBOSE) {
System.out.println(" shard=" + shardIDX + " groupField=" + groupField);
@@ -1176,50 +1396,94 @@ public class TestGrouping extends LuceneTestCase {
final Collection<SearchGroup<BytesRef>> topGroups = getSearchGroups(firstPassCollector, 0);
if (topGroups != null) {
if (VERBOSE) {
- System.out.println(" shard " + shardIDX + " s=" + subSearchers[shardIDX] + " totalGroupedHitCount=?" + " " + topGroups.size() + " groups:");
- for(SearchGroup<BytesRef> group : topGroups) {
- System.out.println(" " + groupToString(group.groupValue) + " groupSort=" + Arrays.toString(group.sortValues));
+ System.out.println(
+ " shard "
+ + shardIDX
+ + " s="
+ + subSearchers[shardIDX]
+ + " totalGroupedHitCount=?"
+ + " "
+ + topGroups.size()
+ + " groups:");
+ for (SearchGroup<BytesRef> group : topGroups) {
+ System.out.println(
+ " "
+ + groupToString(group.groupValue)
+ + " groupSort="
+ + Arrays.toString(group.sortValues));
}
}
shardGroups.add(topGroups);
}
}
- final Collection<SearchGroup<BytesRef>> mergedTopGroups = SearchGroup.merge(shardGroups, groupOffset, topNGroups, groupSort);
+ final Collection<SearchGroup<BytesRef>> mergedTopGroups =
+ SearchGroup.merge(shardGroups, groupOffset, topNGroups, groupSort);
if (VERBOSE) {
System.out.println(" top groups merged:");
if (mergedTopGroups == null) {
System.out.println(" null");
} else {
System.out.println(" " + mergedTopGroups.size() + " top groups:");
- for(SearchGroup<BytesRef> group : mergedTopGroups) {
- System.out.println(" [" + groupToString(group.groupValue) + "] groupSort=" + Arrays.toString(group.sortValues));
+ for (SearchGroup<BytesRef> group : mergedTopGroups) {
+ System.out.println(
+ " ["
+ + groupToString(group.groupValue)
+ + "] groupSort="
+ + Arrays.toString(group.sortValues));
}
}
}
if (mergedTopGroups != null) {
// Now 2nd pass:
- @SuppressWarnings({"unchecked","rawtypes"})
+ @SuppressWarnings({"unchecked", "rawtypes"})
final TopGroups<BytesRef>[] shardTopGroups = new TopGroups[subSearchers.length];
- for(int shardIDX=0;shardIDX<subSearchers.length;shardIDX++) {
- final TopGroupsCollector<?> secondPassCollector = createSecondPassCollector(firstPassGroupingCollectors.get(shardIDX),
- groupField, mergedTopGroups, groupSort, docSort, docOffset + topNDocs, getMaxScores);
+ for (int shardIDX = 0; shardIDX < subSearchers.length; shardIDX++) {
+ final TopGroupsCollector<?> secondPassCollector =
+ createSecondPassCollector(
+ firstPassGroupingCollectors.get(shardIDX),
+ groupField,
+ mergedTopGroups,
+ groupSort,
+ docSort,
+ docOffset + topNDocs,
+ getMaxScores);
subSearchers[shardIDX].search(w, secondPassCollector);
shardTopGroups[shardIDX] = getTopGroups(secondPassCollector, 0);
if (VERBOSE) {
- System.out.println(" " + shardTopGroups[shardIDX].groups.length + " shard[" + shardIDX + "] groups:");
- for(GroupDocs<BytesRef> group : shardTopGroups[shardIDX].groups) {
- System.out.println(" [" + groupToString(group.groupValue) + "] groupSort=" + Arrays.toString(group.groupSortValues) + " numDocs=" + group.scoreDocs.length);
+ System.out.println(
+ " " + shardTopGroups[shardIDX].groups.length + " shard[" + shardIDX + "] groups:");
+ for (GroupDocs<BytesRef> group : shardTopGroups[shardIDX].groups) {
+ System.out.println(
+ " ["
+ + groupToString(group.groupValue)
+ + "] groupSort="
+ + Arrays.toString(group.groupSortValues)
+ + " numDocs="
+ + group.scoreDocs.length);
}
}
}
- TopGroups<BytesRef> mergedGroups = TopGroups.merge(shardTopGroups, groupSort, docSort, docOffset, topNDocs, TopGroups.ScoreMergeMode.None);
+ TopGroups<BytesRef> mergedGroups =
+ TopGroups.merge(
+ shardTopGroups,
+ groupSort,
+ docSort,
+ docOffset,
+ topNDocs,
+ TopGroups.ScoreMergeMode.None);
if (VERBOSE) {
System.out.println(" " + mergedGroups.groups.length + " merged groups:");
- for(GroupDocs<BytesRef> group : mergedGroups.groups) {
- System.out.println(" [" + groupToString(group.groupValue) + "] groupSort=" + Arrays.toString(group.groupSortValues) + " numDocs=" + group.scoreDocs.length);
+ for (GroupDocs<BytesRef> group : mergedGroups.groups) {
+ System.out.println(
+ " ["
+ + groupToString(group.groupValue)
+ + "] groupSort="
+ + Arrays.toString(group.groupSortValues)
+ + " numDocs="
+ + group.scoreDocs.length);
}
}
return mergedGroups;
@@ -1228,21 +1492,39 @@ public class TestGrouping extends LuceneTestCase {
}
}
- private void assertEquals(int[] docIDtoID, TopGroups<BytesRef> expected, TopGroups<BytesRef> actual, boolean verifyGroupValues, boolean verifyTotalGroupCount, boolean idvBasedImplsUsed) {
+ private void assertEquals(
+ int[] docIDtoID,
+ TopGroups<BytesRef> expected,
+ TopGroups<BytesRef> actual,
+ boolean verifyGroupValues,
+ boolean verifyTotalGroupCount,
+ boolean idvBasedImplsUsed) {
if (expected == null) {
assertNull(actual);
return;
}
assertNotNull(actual);
- assertEquals("expected.groups.length != actual.groups.length", expected.groups.length, actual.groups.length);
- assertEquals("expected.totalHitCount != actual.totalHitCount", expected.totalHitCount, actual.totalHitCount);
- assertEquals("expected.totalGroupedHitCount != actual.totalGroupedHitCount", expected.totalGroupedHitCount, actual.totalGroupedHitCount);
+ assertEquals(
+ "expected.groups.length != actual.groups.length",
+ expected.groups.length,
+ actual.groups.length);
+ assertEquals(
+ "expected.totalHitCount != actual.totalHitCount",
+ expected.totalHitCount,
+ actual.totalHitCount);
+ assertEquals(
+ "expected.totalGroupedHitCount != actual.totalGroupedHitCount",
+ expected.totalGroupedHitCount,
+ actual.totalGroupedHitCount);
if (expected.totalGroupCount != null && verifyTotalGroupCount) {
- assertEquals("expected.totalGroupCount != actual.totalGroupCount", expected.totalGroupCount, actual.totalGroupCount);
+ assertEquals(
+ "expected.totalGroupCount != actual.totalGroupCount",
+ expected.totalGroupCount,
+ actual.totalGroupCount);
}
- for(int groupIDX=0;groupIDX<expected.groups.length;groupIDX++) {
+ for (int groupIDX = 0; groupIDX < expected.groups.length; groupIDX++) {
if (VERBOSE) {
System.out.println(" check groupIDX=" + groupIDX);
}
@@ -1258,7 +1540,6 @@ public class TestGrouping extends LuceneTestCase {
} else {
assertEquals(expectedGroup.groupValue, actualGroup.groupValue);
}
-
}
assertArrayEquals(expectedGroup.groupSortValues, actualGroup.groupSortValues);
@@ -1270,10 +1551,11 @@ public class TestGrouping extends LuceneTestCase {
final ScoreDoc[] actualFDs = actualGroup.scoreDocs;
assertEquals(expectedFDs.length, actualFDs.length);
- for(int docIDX=0;docIDX<expectedFDs.length;docIDX++) {
+ for (int docIDX = 0; docIDX < expectedFDs.length; docIDX++) {
final FieldDoc expectedFD = (FieldDoc) expectedFDs[docIDX];
final FieldDoc actualFD = (FieldDoc) actualFDs[docIDX];
- //System.out.println(" actual doc=" + docIDtoID[actualFD.doc] + " score=" + actualFD.score);
+ // System.out.println(" actual doc=" + docIDtoID[actualFD.doc] + " score=" +
+ // actualFD.score);
assertEquals(expectedFD.doc, docIDtoID[actualFD.doc]);
assertArrayEquals(expectedFD.fields, actualFD.fields);
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupingSearch.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupingSearch.java
index d0c0551..bdaa12a 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupingSearch.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGroupingSearch.java
@@ -16,6 +16,9 @@
*/
package org.apache.lucene.search.grouping;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@@ -37,10 +40,6 @@ import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.mutable.MutableValueStr;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
public class TestGroupingSearch extends LuceneTestCase {
// Tests some very basic usages...
@@ -52,10 +51,11 @@ public class TestGroupingSearch extends LuceneTestCase {
customType.setStored(true);
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
boolean canUseIDV = true;
List<Document> documents = new ArrayList<>();
// 0
@@ -122,7 +122,8 @@ public class TestGroupingSearch extends LuceneTestCase {
Sort groupSort = Sort.RELEVANCE;
GroupingSearch groupingSearch = createRandomGroupingSearch(groupField, groupSort, 5, canUseIDV);
- TopGroups<?> groups = groupingSearch.search(indexSearcher, new TermQuery(new Term("content", "random")), 0, 10);
+ TopGroups<?> groups =
+ groupingSearch.search(indexSearcher, new TermQuery(new Term("content", "random")), 0, 10);
assertEquals(7, groups.totalHitCount);
assertEquals(7, groups.totalGroupedHitCount);
@@ -160,13 +161,14 @@ public class TestGroupingSearch extends LuceneTestCase {
Query lastDocInBlock = new TermQuery(new Term("groupend", "x"));
groupingSearch = new GroupingSearch(lastDocInBlock);
- groups = groupingSearch.search(indexSearcher, new TermQuery(new Term("content", "random")), 0, 10);
+ groups =
+ groupingSearch.search(indexSearcher, new TermQuery(new Term("content", "random")), 0, 10);
assertEquals(7, groups.totalHitCount);
assertEquals(7, groups.totalGroupedHitCount);
assertEquals(4, groups.totalGroupCount.longValue());
assertEquals(4, groups.groups.length);
-
+
indexSearcher.getIndexReader().close();
dir.close();
}
@@ -201,7 +203,8 @@ public class TestGroupingSearch extends LuceneTestCase {
}
}
- private GroupingSearch createRandomGroupingSearch(String groupField, Sort groupSort, int docsInGroup, boolean canUseIDV) {
+ private GroupingSearch createRandomGroupingSearch(
+ String groupField, Sort groupSort, int docsInGroup, boolean canUseIDV) {
GroupingSearch groupingSearch;
if (random().nextBoolean()) {
ValueSource vs = new BytesRefFieldSource(groupField);
@@ -222,10 +225,11 @@ public class TestGroupingSearch extends LuceneTestCase {
public void testSetAllGroups() throws Exception {
Directory dir = newDirectory();
- RandomIndexWriter w = new RandomIndexWriter(
- random(),
- dir,
- newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+ RandomIndexWriter w =
+ new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
Document doc = new Document();
doc.add(newField("group", "foo", StringField.TYPE_NOT_STORED));
doc.add(new SortedDocValuesField("group", new BytesRef("foo")));
@@ -238,7 +242,7 @@ public class TestGroupingSearch extends LuceneTestCase {
gs.setAllGroups(true);
TopGroups<?> groups = gs.search(indexSearcher, new TermQuery(new Term("group", "foo")), 0, 10);
assertEquals(1, groups.totalHitCount);
- //assertEquals(1, groups.totalGroupCount.intValue());
+ // assertEquals(1, groups.totalGroupCount.intValue());
assertEquals(1, groups.totalGroupedHitCount);
assertEquals(1, gs.getAllMatchingGroups().size());
indexSearcher.getIndexReader().close();
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeFactory.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeFactory.java
index 0677631..70c1d94 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeFactory.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeFactory.java
@@ -33,7 +33,5 @@ public class TestLongRangeFactory extends LuceneTestCase {
assertEquals(new LongRange(30, 40), factory.getRange(35, scratch));
assertEquals(new LongRange(50, Long.MAX_VALUE), factory.getRange(50, scratch));
assertEquals(new LongRange(50, Long.MAX_VALUE), factory.getRange(500, scratch));
-
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeGroupSelector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeGroupSelector.java
index 7384a56..083bb5c 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeGroupSelector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestLongRangeGroupSelector.java
@@ -42,8 +42,8 @@ public class TestLongRangeGroupSelector extends BaseGroupSelectorTestCase<LongRa
@Override
protected GroupSelector<LongRange> getGroupSelector() {
- return new LongRangeGroupSelector(LongValuesSource.fromLongField("long"),
- new LongRangeFactory(100, 100, 900));
+ return new LongRangeGroupSelector(
+ LongValuesSource.fromLongField("long"), new LongRangeFactory(100, 100, 900));
}
@Override
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTermGroupSelector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTermGroupSelector.java
index e55fd64..9249d45 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTermGroupSelector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTermGroupSelector.java
@@ -35,7 +35,7 @@ public class TestTermGroupSelector extends BaseGroupSelectorTestCase<BytesRef> {
@Override
protected void addGroupField(Document document, int id) {
if (rarely()) {
- return; // missing value
+ return; // missing value
}
String groupValue = "group" + random().nextInt(10);
document.add(new SortedDocValuesField("groupField", new BytesRef(groupValue)));
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTopGroups.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTopGroups.java
index 6ba5ba1..c547525 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTopGroups.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestTopGroups.java
@@ -104,56 +104,87 @@ public class TestTopGroups extends LuceneTestCase {
final TopGroups<String> shard1TopGroups;
{
- final GroupDocs<String> group1 = haveBlueWhale
- ? createSingletonGroupDocs(blueGroupValue, new Object[] { blueWhaleSize }, 1 /* docId */, blueWhaleScore, 0 /* shardIndex */)
- : createEmptyGroupDocs(blueGroupValue, new Object[] { blueWhaleSize });
-
- final GroupDocs<String> group2 = haveRedAnt
- ? createSingletonGroupDocs(redGroupValue, new Object[] { redAntSize }, 2 /* docId */, redAntScore, 0 /* shardIndex */)
- : createEmptyGroupDocs(redGroupValue, new Object[] { redAntSize });
-
- shard1TopGroups = new TopGroups<String>(
- sort.getSort() /* groupSort */,
- sort.getSort() /* withinGroupSort */,
- group1.scoreDocs.length + group2.scoreDocs.length /* totalHitCount */,
- group1.scoreDocs.length + group2.scoreDocs.length /* totalGroupedHitCount */,
- combineGroupDocs(group1, group2) /* groups */,
- (haveBlueWhale ? blueWhaleScore : (haveRedAnt ? redAntScore : Float.NaN)) /* maxScore */);
+ final GroupDocs<String> group1 =
+ haveBlueWhale
+ ? createSingletonGroupDocs(
+ blueGroupValue,
+ new Object[] {blueWhaleSize},
+ 1 /* docId */,
+ blueWhaleScore,
+ 0 /* shardIndex */)
+ : createEmptyGroupDocs(blueGroupValue, new Object[] {blueWhaleSize});
+
+ final GroupDocs<String> group2 =
+ haveRedAnt
+ ? createSingletonGroupDocs(
+ redGroupValue,
+ new Object[] {redAntSize},
+ 2 /* docId */,
+ redAntScore,
+ 0 /* shardIndex */)
+ : createEmptyGroupDocs(redGroupValue, new Object[] {redAntSize});
+
+ shard1TopGroups =
+ new TopGroups<String>(
+ sort.getSort() /* groupSort */,
+ sort.getSort() /* withinGroupSort */,
+ group1.scoreDocs.length + group2.scoreDocs.length /* totalHitCount */,
+ group1.scoreDocs.length + group2.scoreDocs.length /* totalGroupedHitCount */,
+ combineGroupDocs(group1, group2) /* groups */,
+ (haveBlueWhale
+ ? blueWhaleScore
+ : (haveRedAnt ? redAntScore : Float.NaN)) /* maxScore */);
}
final TopGroups<String> shard2TopGroups;
{
- final GroupDocs<String> group1 = haveBlueDragonfly
- ? createSingletonGroupDocs(blueGroupValue, new Object[] { blueDragonflySize }, 3 /* docId */, blueDragonflyScore, 1 /* shardIndex */)
- : createEmptyGroupDocs(blueGroupValue, new Object[] { blueDragonflySize });
-
- final GroupDocs<String> group2 = haveRedSquirrel
- ? createSingletonGroupDocs(redGroupValue, new Object[] { redSquirrelSize }, 4 /* docId */, redSquirrelScore, 1 /* shardIndex */)
- : createEmptyGroupDocs(redGroupValue, new Object[] { redSquirrelSize });
-
- shard2TopGroups = new TopGroups<String>(
- sort.getSort() /* groupSort */,
- sort.getSort() /* withinGroupSort */,
- group1.scoreDocs.length + group2.scoreDocs.length /* totalHitCount */,
- group1.scoreDocs.length + group2.scoreDocs.length /* totalGroupedHitCount */,
- combineGroupDocs(group1, group2) /* groups */,
- (haveRedSquirrel ? redSquirrelScore : (haveBlueDragonfly ? blueDragonflyScore : Float.NaN)) /* maxScore */);
+ final GroupDocs<String> group1 =
+ haveBlueDragonfly
+ ? createSingletonGroupDocs(
+ blueGroupValue,
+ new Object[] {blueDragonflySize},
+ 3 /* docId */,
+ blueDragonflyScore,
+ 1 /* shardIndex */)
+ : createEmptyGroupDocs(blueGroupValue, new Object[] {blueDragonflySize});
+
+ final GroupDocs<String> group2 =
+ haveRedSquirrel
+ ? createSingletonGroupDocs(
+ redGroupValue,
+ new Object[] {redSquirrelSize},
+ 4 /* docId */,
+ redSquirrelScore,
+ 1 /* shardIndex */)
+ : createEmptyGroupDocs(redGroupValue, new Object[] {redSquirrelSize});
+
+ shard2TopGroups =
+ new TopGroups<String>(
+ sort.getSort() /* groupSort */,
+ sort.getSort() /* withinGroupSort */,
+ group1.scoreDocs.length + group2.scoreDocs.length /* totalHitCount */,
+ group1.scoreDocs.length + group2.scoreDocs.length /* totalGroupedHitCount */,
+ combineGroupDocs(group1, group2) /* groups */,
+ (haveRedSquirrel
+ ? redSquirrelScore
+ : (haveBlueDragonfly ? blueDragonflyScore : Float.NaN)) /* maxScore */);
}
- final TopGroups<String> mergedTopGroups = TopGroups.<String>merge(
- combineTopGroups(shard1TopGroups, shard2TopGroups),
- sort /* groupSort */,
- sort /* docSort */,
- 0 /* docOffset */,
- 2 /* docTopN */,
- TopGroups.ScoreMergeMode.None);
+ final TopGroups<String> mergedTopGroups =
+ TopGroups.<String>merge(
+ combineTopGroups(shard1TopGroups, shard2TopGroups),
+ sort /* groupSort */,
+ sort /* docSort */,
+ 0 /* docOffset */,
+ 2 /* docTopN */,
+ TopGroups.ScoreMergeMode.None);
assertNotNull(mergedTopGroups);
final int expectedCount =
- (haveBlueWhale ? 1 : 0) +
- (haveRedAnt ? 1 : 0) +
- (haveBlueDragonfly ? 1 : 0) +
- (haveRedSquirrel ? 1 : 0);
+ (haveBlueWhale ? 1 : 0)
+ + (haveRedAnt ? 1 : 0)
+ + (haveBlueDragonfly ? 1 : 0)
+ + (haveRedSquirrel ? 1 : 0);
assertEquals(expectedCount, mergedTopGroups.totalHitCount);
assertEquals(expectedCount, mergedTopGroups.totalGroupedHitCount);
@@ -173,11 +204,13 @@ public class TestTopGroups extends LuceneTestCase {
}
final float expectedMaxScore =
- (haveBlueWhale ? blueWhaleScore
- : (haveRedSquirrel ? redSquirrelScore
- : (haveBlueDragonfly ? blueDragonflyScore
- : (haveRedAnt ? redAntScore
- : Float.NaN))));
+ (haveBlueWhale
+ ? blueWhaleScore
+ : (haveRedSquirrel
+ ? redSquirrelScore
+ : (haveBlueDragonfly
+ ? blueDragonflyScore
+ : (haveRedAnt ? redAntScore : Float.NaN))));
checkMaxScore(expectedMaxScore, mergedTopGroups.maxScore);
}
@@ -191,41 +224,43 @@ public class TestTopGroups extends LuceneTestCase {
// helper methods
- private static GroupDocs<String> createEmptyGroupDocs(String groupValue, Object[] groupSortValues) {
- return new GroupDocs<String>(
+ private static GroupDocs<String> createEmptyGroupDocs(
+ String groupValue, Object[] groupSortValues) {
+ return new GroupDocs<String>(
Float.NaN /* score */,
Float.NaN /* maxScore */,
new TotalHits(0, TotalHits.Relation.EQUAL_TO),
new ScoreDoc[0],
groupValue,
groupSortValues);
- }
+ }
- private static GroupDocs<String> createSingletonGroupDocs(String groupValue, Object[] groupSortValues,
- int docId, float docScore, int shardIndex) {
- return new GroupDocs<String>(
+ private static GroupDocs<String> createSingletonGroupDocs(
+ String groupValue, Object[] groupSortValues, int docId, float docScore, int shardIndex) {
+ return new GroupDocs<String>(
Float.NaN /* score */,
docScore /* maxScore */,
new TotalHits(1, TotalHits.Relation.EQUAL_TO),
- new ScoreDoc[] { new ScoreDoc(docId, docScore, shardIndex) },
+ new ScoreDoc[] {new ScoreDoc(docId, docScore, shardIndex)},
groupValue,
groupSortValues);
- }
+ }
- private static GroupDocs<String>[] combineGroupDocs(GroupDocs<String> group0, GroupDocs<String> group1) {
- @SuppressWarnings({"unchecked","rawtypes"})
+ private static GroupDocs<String>[] combineGroupDocs(
+ GroupDocs<String> group0, GroupDocs<String> group1) {
+ @SuppressWarnings({"unchecked", "rawtypes"})
final GroupDocs<String>[] groups = new GroupDocs[2];
groups[0] = group0;
groups[1] = group1;
return groups;
}
- private static TopGroups<String>[] combineTopGroups(TopGroups<String> group0, TopGroups<String> group1) {
- @SuppressWarnings({"unchecked","rawtypes"})
+ private static TopGroups<String>[] combineTopGroups(
+ TopGroups<String> group0, TopGroups<String> group1) {
+ @SuppressWarnings({"unchecked", "rawtypes"})
final TopGroups<String>[] groups = new TopGroups[2];
groups[0] = group0;
groups[1] = group1;
return groups;
}
-
}
diff --git a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestValueSourceGroupSelector.java b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestValueSourceGroupSelector.java
index 9e652b6..0c62169 100644
--- a/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestValueSourceGroupSelector.java
+++ b/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestValueSourceGroupSelector.java
@@ -18,7 +18,6 @@
package org.apache.lucene.search.grouping;
import java.util.HashMap;
-
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.SortedDocValuesField;
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/AbstractHandler.java b/lucene/luke/src/java/org/apache/lucene/luke/app/AbstractHandler.java
index bca88f1..5abd9d9 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/AbstractHandler.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/AbstractHandler.java
@@ -20,7 +20,6 @@ package org.apache.lucene.luke.app;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.List;
-
import org.apache.logging.log4j.Logger;
import org.apache.lucene.luke.util.LoggerFactory;
@@ -45,5 +44,4 @@ public abstract class AbstractHandler<T extends Observer> {
}
protected abstract void notifyOne(T observer);
-
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryHandler.java b/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryHandler.java
index ec4e7e5..3d2de05 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryHandler.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryHandler.java
@@ -19,7 +19,6 @@ package org.apache.lucene.luke.app;
import java.io.IOException;
import java.util.Objects;
-
import org.apache.lucene.luke.app.desktop.util.MessageUtils;
import org.apache.lucene.luke.models.LukeException;
import org.apache.lucene.luke.models.util.IndexUtils;
@@ -60,7 +59,8 @@ public final class DirectoryHandler extends AbstractHandler<DirectoryObserver> {
try {
dir = IndexUtils.openDirectory(indexPath, dirImpl);
} catch (IOException e) {
- throw new LukeException(MessageUtils.getLocalizedMessage("openindex.message.index_path_invalid", indexPath), e);
+ throw new LukeException(
+ MessageUtils.getLocalizedMessage("openindex.message.index_path_invalid", indexPath), e);
}
state = new LukeStateImpl();
@@ -108,5 +108,4 @@ public final class DirectoryHandler extends AbstractHandler<DirectoryObserver> {
return dir;
}
}
-
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryObserver.java b/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryObserver.java
index 6437115..83afae0 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryObserver.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/DirectoryObserver.java
@@ -23,5 +23,4 @@ public interface DirectoryObserver extends Observer {
void openDirectory(LukeState state);
void closeDirectory();
-
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/IndexHandler.java b/lucene/luke/src/java/org/apache/lucene/luke/app/IndexHandler.java
index 885c34a..f3fc635 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/IndexHandler.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/IndexHandler.java
@@ -19,7 +19,6 @@ package org.apache.lucene.luke.app;
import java.lang.invoke.MethodHandles;
import java.util.Objects;
-
import org.apache.logging.log4j.Logger;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.luke.app.desktop.util.MessageUtils;
@@ -57,7 +56,12 @@ public final class IndexHandler extends AbstractHandler<IndexObserver> {
open(indexPath, dirImpl, false, false, false);
}
- public void open(String indexPath, String dirImpl, boolean readOnly, boolean useCompound, boolean keepAllCommits) {
+ public void open(
+ String indexPath,
+ String dirImpl,
+ boolean readOnly,
+ boolean useCompound,
+ boolean keepAllCommits) {
Objects.requireNonNull(indexPath);
if (indexOpened()) {
@@ -69,7 +73,8 @@ public final class IndexHandler extends AbstractHandler<IndexObserver> {
reader = IndexUtils.openIndex(indexPath, dirImpl);
} catch (Exception e) {
log.error("Error opening index", e);
- throw new LukeException(MessageUtils.getLocalizedMessage("openindex.message.index_path_invalid", indexPath), e);
+ throw new LukeException(
+ MessageUtils.getLocalizedMessage("openindex.message.index_path_invalid", indexPath), e);
}
state = new LukeStateImpl();
@@ -96,7 +101,12 @@ public final class IndexHandler extends AbstractHandler<IndexObserver> {
public void reOpen() {
close();
- open(state.getIndexPath(), state.getDirImpl(), state.readOnly(), state.useCompound(), state.keepAllCommits());
+ open(
+ state.getIndexPath(),
+ state.getDirImpl(),
+ state.readOnly(),
+ state.useCompound(),
+ state.keepAllCommits());
}
public LukeState getState() {
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/IndexObserver.java b/lucene/luke/src/java/org/apache/lucene/luke/app/IndexObserver.java
index 599b109..21265ae 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/IndexObserver.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/IndexObserver.java
@@ -23,5 +23,4 @@ public interface IndexObserver extends Observer {
void openIndex(LukeState state);
void closeIndex();
-
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/LukeState.java b/lucene/luke/src/java/org/apache/lucene/luke/app/LukeState.java
index 33ca829..492efd3 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/LukeState.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/LukeState.java
@@ -21,9 +21,7 @@ import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.Directory;
-/**
- * Holder for current index/directory.
- */
+/** Holder for current index/directory. */
public interface LukeState {
String getIndexPath();
@@ -53,5 +51,4 @@ public interface LukeState {
default boolean hasDirectoryReader() {
return getIndexReader() instanceof DirectoryReader;
}
-
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/Observer.java b/lucene/luke/src/java/org/apache/lucene/luke/app/Observer.java
index 290865b..16d35a7 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/Observer.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/Observer.java
@@ -18,5 +18,4 @@
package org.apache.lucene.luke.app;
/** Marker interface for observers */
-public interface Observer {
-}
+public interface Observer {}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java
index fae52f2..78c5254 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java
@@ -17,13 +17,14 @@
package org.apache.lucene.luke.app.desktop;
-import javax.swing.JFrame;
-import javax.swing.UIManager;
+import static org.apache.lucene.luke.app.desktop.util.ExceptionHandler.handle;
+
import java.awt.GraphicsEnvironment;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.nio.file.FileSystems;
-
+import javax.swing.JFrame;
+import javax.swing.UIManager;
import org.apache.logging.log4j.Logger;
import org.apache.lucene.luke.app.desktop.components.LukeWindowProvider;
import org.apache.lucene.luke.app.desktop.components.dialog.menubar.OpenIndexDialogFactory;
@@ -32,20 +33,22 @@ import org.apache.lucene.luke.app.desktop.util.FontUtils;
import org.apache.lucene.luke.app.desktop.util.MessageUtils;
import org.apache.lucene.luke.util.LoggerFactory;
-import static org.apache.lucene.luke.app.desktop.util.ExceptionHandler.handle;
-
/** Entry class for desktop Luke */
public class LukeMain {
- public static final String LOG_FILE = System.getProperty("user.home") +
- FileSystems.getDefault().getSeparator() + ".luke.d" +
- FileSystems.getDefault().getSeparator() + "luke.log";
+ public static final String LOG_FILE =
+ System.getProperty("user.home")
+ + FileSystems.getDefault().getSeparator()
+ + ".luke.d"
+ + FileSystems.getDefault().getSeparator()
+ + "luke.log";
static {
LoggerFactory.initGuiLogging(LOG_FILE);
}
+
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
+
private static JFrame frame;
public static JFrame getOwnerFrame() {
@@ -55,9 +58,7 @@ public class LukeMain {
private static void createAndShowGUI() {
// uncaught error handler
MessageBroker messageBroker = MessageBroker.getInstance();
- Thread.setDefaultUncaughtExceptionHandler((thread, cause) ->
- handle(cause, messageBroker)
- );
+ Thread.setDefaultUncaughtExceptionHandler((thread, cause) -> handle(cause, messageBroker));
try {
frame = new LukeWindowProvider().get();
@@ -68,9 +69,12 @@ public class LukeMain {
// show open index dialog
OpenIndexDialogFactory openIndexDialogFactory = OpenIndexDialogFactory.getInstance();
- new DialogOpener<>(openIndexDialogFactory).open(MessageUtils.getLocalizedMessage("openindex.dialog.title"), 600, 420,
- (factory) -> {
- });
+ new DialogOpener<>(openIndexDialogFactory)
+ .open(
+ MessageUtils.getLocalizedMessage("openindex.dialog.title"),
+ 600,
+ 420,
+ (factory) -> {});
} catch (IOException e) {
messageBroker.showUnknownErrorMessage();
log.error("Cannot initialize components.", e);
@@ -79,7 +83,8 @@ public class LukeMain {
public static void main(String[] args) throws Exception {
String lookAndFeelClassName = UIManager.getSystemLookAndFeelClassName();
- if (!lookAndFeelClassName.contains("AquaLookAndFeel") && !lookAndFeelClassName.contains("PlasticXPLookAndFeel")) {
+ if (!lookAndFeelClassName.contains("AquaLookAndFeel")
+ && !lookAndFeelClassName.contains("PlasticXPLookAndFeel")) {
// may be running on linux platform
lookAndFeelClassName = "javax.swing.plaf.metal.MetalLookAndFeel";
}
@@ -89,6 +94,5 @@ public class LukeMain {
genv.registerFont(FontUtils.createElegantIconFont());
javax.swing.SwingUtilities.invokeLater(LukeMain::createAndShowGUI);
-
}
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/MessageBroker.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/MessageBroker.java
index 9609a2f..56c791b 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/MessageBroker.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/MessageBroker.java
@@ -61,5 +61,4 @@ public class MessageBroker {
void clearStatusMessage();
}
-
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/Preferences.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/Preferences.java
index b0df660..982e4d8 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/Preferences.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/Preferences.java
@@ -38,7 +38,13 @@ public interface Preferences {
boolean isKeepAllCommits();
- void setIndexOpenerPrefs(boolean readOnly, String dirImpl, boolean noReader, boolean useCompound, boolean keepAllCommits) throws IOException;
+ void setIndexOpenerPrefs(
+ boolean readOnly,
+ String dirImpl,
+ boolean noReader,
+ boolean useCompound,
+ boolean keepAllCommits)
+ throws IOException;
ColorTheme getColorTheme();
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesFactory.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesFactory.java
index 2502553..b043e8f 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesFactory.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesFactory.java
@@ -24,11 +24,10 @@ public class PreferencesFactory {
private static Preferences prefs;
- public synchronized static Preferences getInstance() throws IOException {
+ public static synchronized Preferences getInstance() throws IOException {
if (prefs == null) {
prefs = new PreferencesImpl();
}
return prefs;
}
-
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesImpl.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesImpl.java
index ebf78c5..47d6331 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesImpl.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/PreferencesImpl.java
@@ -23,7 +23,6 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
-
import org.apache.lucene.luke.app.desktop.util.inifile.IniFile;
import org.apache.lucene.luke.app.desktop.util.inifile.SimpleIniFile;
import org.apache.lucene.store.FSDirectory;
@@ -31,14 +30,14 @@ import org.apache.lucene.store.FSDirectory;
/** Default implementation of {@link Preferences} */
public final class PreferencesImpl implements Preferences {
- private static final String CONFIG_DIR = System.getProperty("user.home") + FileSystems.getDefault().getSeparator() + ".luke.d";
+ private static final String CONFIG_DIR =
+ System.getProperty("user.home") + FileSystems.getDefault().getSeparator() + ".luke.d";
private static final String INIT_FILE = "luke.ini";
private static final String HISTORY_FILE = "history";
private static final int MAX_HISTORY = 10;
private final IniFile ini = new SimpleIniFile();
-
private final List<String> history = new ArrayList<>();
public PreferencesImpl() throws IOException {
@@ -61,7 +60,6 @@ public final class PreferencesImpl implements Preferences {
List<String> allHistory = Files.readAllLines(histFile);
history.addAll(allHistory.subList(0, Math.min(MAX_HISTORY, allHistory.size())));
}
-
}
public List<String> getHistory() {
@@ -128,7 +126,13 @@ public final class PreferencesImpl implements Preferences {
}
@Override
- public void setIndexOpenerPrefs(boolean readOnly, String dirImpl, boolean noReader, boolean useCompound, boolean keepAllCommits) throws IOException {
+ public void setIndexOpenerPrefs(
+ boolean readOnly,
+ String dirImpl,
+ boolean noReader,
+ boolean useCompound,
+ boolean keepAllCommits)
+ throws IOException {
ini.put("opener", "readOnly", readOnly);
ini.put("opener", "dirImpl", dirImpl);
ini.put("opener", "noReader", noReader);
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisPanelProvider.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisPanelProvider.java
index 864dfcd..b031437 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisPanelProvider.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisPanelProvider.java
@@ -17,16 +17,6 @@
package org.apache.lucene.luke.app.desktop.components;
-import javax.swing.BorderFactory;
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
@@ -39,7 +29,16 @@ import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-
+import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTextArea;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.custom.CustomAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
@@ -126,16 +125,21 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
operatorRegistry.register(AnalysisTabOperator.class, this);
- operatorRegistry.get(PresetAnalyzerPanelOperator.class).ifPresent(operator -> {
- // Scanning all Analyzer types will take time...
- ExecutorService executorService =
- Executors.newFixedThreadPool(1, new NamedThreadFactory("load-preset-analyzer-types"));
- executorService.execute(() -> {
- operator.setPresetAnalyzers(analysisModel.getPresetAnalyzerTypes());
- operator.setSelectedAnalyzer(analysisModel.currentAnalyzer().getClass());
- });
- executorService.shutdown();
- });
+ operatorRegistry
+ .get(PresetAnalyzerPanelOperator.class)
+ .ifPresent(
+ operator -> {
+ // Scanning all Analyzer types will take time...
+ ExecutorService executorService =
+ Executors.newFixedThreadPool(
+ 1, new NamedThreadFactory("load-preset-analyzer-types"));
+ executorService.execute(
+ () -> {
+ operator.setPresetAnalyzers(analysisModel.getPresetAnalyzerTypes());
+ operator.setSelectedAnalyzer(analysisModel.currentAnalyzer().getClass());
+ });
+ executorService.shutdown();
+ });
}
public JPanel get() {
@@ -143,7 +147,8 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
panel.setOpaque(false);
panel.setBorder(BorderFactory.createLineBorder(Color.gray));
- JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, initUpperPanel(), initLowerPanel());
+ JSplitPane splitPane =
+ new JSplitPane(JSplitPane.VERTICAL_SPLIT, initUpperPanel(), initLowerPanel());
splitPane.setOpaque(false);
splitPane.setDividerLocation(320);
panel.add(splitPane);
@@ -194,16 +199,18 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
JPanel analyzerName = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 2));
analyzerName.setOpaque(false);
- analyzerName.add(new JLabel(MessageUtils.getLocalizedMessage("analysis.label.selected_analyzer")));
+ analyzerName.add(
+ new JLabel(MessageUtils.getLocalizedMessage("analysis.label.selected_analyzer")));
analyzerNameLbl.setText(analysisModel.currentAnalyzer().getClass().getName());
analyzerName.add(analyzerNameLbl);
showChainLbl.setText(MessageUtils.getLocalizedMessage("analysis.label.show_chain"));
- showChainLbl.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- listeners.showAnalysisChain(e);
- }
- });
+ showChainLbl.addMouseListener(
+ new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ listeners.showAnalysisChain(e);
+ }
+ });
showChainLbl.setVisible(analysisModel.currentAnalyzer() instanceof CustomAnalyzer);
analyzerName.add(FontUtils.toLinkText(showChainLbl));
inner1.add(analyzerName, BorderLayout.PAGE_START);
@@ -217,8 +224,10 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
inputArea.setText(MessageUtils.getLocalizedMessage("analysis.textarea.prompt"));
input.add(new JScrollPane(inputArea));
- JButton executeBtn = new JButton(FontUtils.elegantIconHtml("",
- MessageUtils.getLocalizedMessage("analysis.button.test")));
+ JButton executeBtn =
+ new JButton(
+ FontUtils.elegantIconHtml(
+ "", MessageUtils.getLocalizedMessage("analysis.button.test")));
executeBtn.setFont(StyleConstants.FONT_BUTTON_LARGE);
executeBtn.setMargin(new Insets(3, 3, 3, 3));
executeBtn.addActionListener(listeners::executeAnalysis);
@@ -233,13 +242,16 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
JButton clearBtn = new JButton(MessageUtils.getLocalizedMessage("button.clear"));
clearBtn.setFont(StyleConstants.FONT_BUTTON_LARGE);
clearBtn.setMargin(new Insets(5, 5, 5, 5));
- clearBtn.addActionListener(e -> {
- inputArea.setText("");
- operatorRegistry.get(SimpleAnalyzeResultPanelOperator.class).ifPresent(
- SimpleAnalyzeResultPanelOperator::clearTable);
- operatorRegistry.get(StepByStepAnalyzeResultPanelOperator.class).ifPresent(
- StepByStepAnalyzeResultPanelOperator::clearTable);
- });
+ clearBtn.addActionListener(
+ e -> {
+ inputArea.setText("");
+ operatorRegistry
+ .get(SimpleAnalyzeResultPanelOperator.class)
+ .ifPresent(SimpleAnalyzeResultPanelOperator::clearTable);
+ operatorRegistry
+ .get(StepByStepAnalyzeResultPanelOperator.class)
+ .ifPresent(StepByStepAnalyzeResultPanelOperator::clearTable);
+ });
input.add(clearBtn);
inner1.add(input, BorderLayout.CENTER);
@@ -259,20 +271,26 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
mainPanel.remove(custom);
mainPanel.add(preset, BorderLayout.CENTER);
- operatorRegistry.get(PresetAnalyzerPanelOperator.class).ifPresent(operator -> {
- operator.setPresetAnalyzers(analysisModel.getPresetAnalyzerTypes());
- operator.setSelectedAnalyzer(analysisModel.currentAnalyzer().getClass());
- });
+ operatorRegistry
+ .get(PresetAnalyzerPanelOperator.class)
+ .ifPresent(
+ operator -> {
+ operator.setPresetAnalyzers(analysisModel.getPresetAnalyzerTypes());
+ operator.setSelectedAnalyzer(analysisModel.currentAnalyzer().getClass());
+ });
stepByStepCB.setSelected(false);
stepByStepCB.setVisible(false);
} else if (command.equalsIgnoreCase(TYPE_CUSTOM)) {
mainPanel.remove(preset);
mainPanel.add(custom, BorderLayout.CENTER);
- operatorRegistry.get(CustomAnalyzerPanelOperator.class).ifPresent(operator -> {
- operator.setAnalysisModel(analysisModel);
- operator.resetAnalysisComponents();
- });
+ operatorRegistry
+ .get(CustomAnalyzerPanelOperator.class)
+ .ifPresent(
+ operator -> {
+ operator.setAnalysisModel(analysisModel);
+ operator.resetAnalysisComponents();
+ });
stepByStepCB.setVisible(true);
}
mainPanel.setVisible(false);
@@ -282,16 +300,20 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
void executeAnalysis() {
String text = inputArea.getText();
if (Objects.isNull(text) || text.isEmpty()) {
- messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("analysis.message.empry_input"));
+ messageBroker.showStatusMessage(
+ MessageUtils.getLocalizedMessage("analysis.message.empry_input"));
}
lowerPanel.remove(stepByStepResult);
lowerPanel.add(simpleResult, BorderLayout.CENTER);
- operatorRegistry.get(SimpleAnalyzeResultPanelOperator.class).ifPresent(operator -> {
- operator.setAnalysisModel(analysisModel);
- operator.executeAnalysis(text);
- });
+ operatorRegistry
+ .get(SimpleAnalyzeResultPanelOperator.class)
+ .ifPresent(
+ operator -> {
+ operator.setAnalysisModel(analysisModel);
+ operator.executeAnalysis(text);
+ });
lowerPanel.setVisible(false);
lowerPanel.setVisible(true);
@@ -300,14 +322,18 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
void executeAnalysisStepByStep() {
String text = inputArea.getText();
if (Objects.isNull(text) || text.isEmpty()) {
- messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("analysis.message.empry_input"));
+ messageBroker.showStatusMessage(
+ MessageUtils.getLocalizedMessage("analysis.message.empry_input"));
}
lowerPanel.remove(simpleResult);
lowerPanel.add(stepByStepResult, BorderLayout.CENTER);
- operatorRegistry.get(StepByStepAnalyzeResultPanelOperator.class).ifPresent(operator -> {
- operator.setAnalysisModel(analysisModel);
- operator.executeAnalysisStepByStep(text);
- });
+ operatorRegistry
+ .get(StepByStepAnalyzeResultPanelOperator.class)
+ .ifPresent(
+ operator -> {
+ operator.setAnalysisModel(analysisModel);
+ operator.executeAnalysisStepByStep(text);
+ });
lowerPanel.setVisible(false);
lowerPanel.setVisible(true);
@@ -316,10 +342,14 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
void showAnalysisChainDialog() {
if (getCurrentAnalyzer() instanceof CustomAnalyzer) {
CustomAnalyzer analyzer = (CustomAnalyzer) getCurrentAnalyzer();
- new DialogOpener<>(analysisChainDialogFactory).open("Analysis chain", 600, 320,
- (factory) -> {
- factory.setAnalyzer(analyzer);
- });
+ new DialogOpener<>(analysisChainDialogFactory)
+ .open(
+ "Analysis chain",
+ 600,
+ 320,
+ (factory) -> {
+ factory.setAnalyzer(analyzer);
+ });
}
}
@@ -328,12 +358,15 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
analysisModel.createAnalyzerFromClassName(analyzerType);
analyzerNameLbl.setText(analysisModel.currentAnalyzer().getClass().getName());
showChainLbl.setVisible(false);
- operatorRegistry.get(AnalyzerTabOperator.class).ifPresent(operator ->
- operator.setAnalyzer(analysisModel.currentAnalyzer()));
- operatorRegistry.get(MLTTabOperator.class).ifPresent(operator ->
- operator.setAnalyzer(analysisModel.currentAnalyzer()));
- operatorRegistry.get(AddDocumentDialogOperator.class).ifPresent(operator ->
- operator.setAnalyzer(analysisModel.currentAnalyzer()));
+ operatorRegistry
+ .get(AnalyzerTabOperator.class)
+ .ifPresent(operator -> operator.setAnalyzer(analysisModel.currentAnalyzer()));
+ operatorRegistry
+ .get(MLTTabOperator.class)
+ .ifPresent(operator -> operator.setAnalyzer(analysisModel.currentAnalyzer()));
+ operatorRegistry
+ .get(AddDocumentDialogOperator.class)
+ .ifPresent(operator -> operator.setAnalyzer(analysisModel.currentAnalyzer()));
}
@Override
@@ -341,12 +374,15 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
analysisModel.buildCustomAnalyzer(config);
analyzerNameLbl.setText(analysisModel.currentAnalyzer().getClass().getName());
showChainLbl.setVisible(true);
- operatorRegistry.get(AnalyzerTabOperator.class).ifPresent(operator ->
- operator.setAnalyzer(analysisModel.currentAnalyzer()));
- operatorRegistry.get(MLTTabOperator.class).ifPresent(operator ->
- operator.setAnalyzer(analysisModel.currentAnalyzer()));
- operatorRegistry.get(AddDocumentDialogOperator.class).ifPresent(operator ->
- operator.setAnalyzer(analysisModel.currentAnalyzer()));
+ operatorRegistry
+ .get(AnalyzerTabOperator.class)
+ .ifPresent(operator -> operator.setAnalyzer(analysisModel.currentAnalyzer()));
+ operatorRegistry
+ .get(MLTTabOperator.class)
+ .ifPresent(operator -> operator.setAnalyzer(analysisModel.currentAnalyzer()));
+ operatorRegistry
+ .get(AddDocumentDialogOperator.class)
+ .ifPresent(operator -> operator.setAnalyzer(analysisModel.currentAnalyzer()));
}
@Override
@@ -372,9 +408,6 @@ public final class AnalysisPanelProvider implements AnalysisTabOperator {
}
}
- void executeAnalysisStepByStep(ActionEvent e) {
- }
+ void executeAnalysisStepByStep(ActionEvent e) {}
}
-
}
-
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisTabOperator.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisTabOperator.java
index 555f1c0..1ad7d5c 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisTabOperator.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/AnalysisTabOperator.java
@@ -28,6 +28,4 @@ public interface AnalysisTabOperator extends ComponentOperatorRegistry.Component
void setAnalyzerByCustomConfiguration(CustomAnalyzerConfig config);
Analyzer getCurrentAnalyzer();
-
}
-
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/CommitsPanelProvider.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/CommitsPanelProvider.java
index d06abcc..8d55855 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/CommitsPanelProvider.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/CommitsPanelProvider.java
@@ -17,6 +17,18 @@
package org.apache.lucene.luke.app.desktop.components;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
@@ -32,19 +44,6 @@ import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.FlowLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.luke.app.DirectoryHandler;
import org.apache.lucene.luke.app.DirectoryObserver;
@@ -100,7 +99,8 @@ public final class CommitsPanelProvider {
panel.setOpaque(false);
panel.setBorder(BorderFactory.createLineBorder(Color.gray));
- JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, initUpperPanel(), initLowerPanel());
+ JSplitPane splitPane =
+ new JSplitPane(JSplitPane.VERTICAL_SPLIT, initUpperPanel(), initLowerPanel());
splitPane.setOpaque(false);
splitPane.setBorder(BorderFactory.createEmptyBorder());
splitPane.setDividerLocation(120);
@@ -162,7 +162,11 @@ public final class CommitsPanelProvider {
userDataTA.setLineWrap(true);
userDataTA.setWrapStyleWord(true);
userDataTA.setEditable(false);
- JScrollPane userDataScroll = new JScrollPane(userDataTA, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ JScrollPane userDataScroll =
+ new JScrollPane(
+ userDataTA,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
c1.gridx = 1;
c1.gridy = 2;
c1.weightx = 0.5;
@@ -179,7 +183,8 @@ public final class CommitsPanelProvider {
panel.setOpaque(false);
panel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
- JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, initFilesPanel(), initSegmentsPanel());
+ JSplitPane splitPane =
+ new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, initFilesPanel(), initSegmentsPanel());
splitPane.setOpaque(false);
splitPane.setBorder(BorderFactory.createEmptyBorder());
splitPane.setDividerLocation(300);
@@ -197,7 +202,12 @@ public final class CommitsPanelProvider {
header.add(new JLabel(MessageUtils.getLocalizedMessage("commits.label.files")));
panel.add(header, BorderLayout.PAGE_START);
- TableUtils.setupTable(filesTable, ListSelectionModel.SINGLE_SELECTION, new FilesTableModel(), null, FilesTableModel.Column.FILENAME.getColumnWidth());
+ TableUtils.setupTable(
+ filesTable,
+ ListSelectionModel.SINGLE_SELECTION,
+ new FilesTableModel(),
+ null,
+ FilesTableModel.Column.FILENAME.getColumnWidth());
panel.add(new JScrollPane(filesTable), BorderLayout.CENTER);
return panel;
@@ -213,7 +223,10 @@ public final class CommitsPanelProvider {
segments.add(new JLabel(MessageUtils.getLocalizedMessage("commits.label.segments")));
panel.add(segments);
- TableUtils.setupTable(segmentsTable, ListSelectionModel.SINGLE_SELECTION, new SegmentsTableModel(),
+ TableUtils.setupTable(
+ segmentsTable,
+ ListSelectionModel.SINGLE_SELECTION,
+ new SegmentsTableModel(),
new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
@@ -241,12 +254,13 @@ public final class CommitsPanelProvider {
diagRB.setSelected(true);
diagRB.setEnabled(false);
diagRB.setOpaque(false);
- diagRB.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- listeners.showSegmentDetails(e);
- }
- });
+ diagRB.addMouseListener(
+ new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ listeners.showSegmentDetails(e);
+ }
+ });
buttons.add(diagRB);
attrRB.setText("Attributes");
@@ -254,12 +268,13 @@ public final class CommitsPanelProvider {
attrRB.setSelected(false);
attrRB.setEnabled(false);
attrRB.setOpaque(false);
- attrRB.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- listeners.showSegmentDetails(e);
- }
- });
+ attrRB.addMouseListener(
+ new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ listeners.showSegmentDetails(e);
+ }
+ });
buttons.add(attrRB);
codecRB.setText("Codec");
@@ -267,12 +282,13 @@ public final class CommitsPanelProvider {
codecRB.setSelected(false);
codecRB.setEnabled(false);
codecRB.setOpaque(false);
- codecRB.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- listeners.showSegmentDetails(e);
- }
- });
+ codecRB.addMouseListener(
+ new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ listeners.showSegmentDetails(e);
+ }
+ });
buttons.add(codecRB);
rbGroup.add(diagRB);
@@ -296,30 +312,55 @@ public final class CommitsPanelProvider {
segDetailList.setModel(new DefaultListModel<>());
long commitGen = (long) commitGenCombo.getSelectedItem();
- commitsModel.getCommit(commitGen).ifPresent(commit -> {
- deletedLbl.setText(String.valueOf(commit.isDeleted()));
- segCntLbl.setText(String.valueOf(commit.getSegCount()));
- userDataTA.setText(commit.getUserData());
- });
+ commitsModel
+ .getCommit(commitGen)
+ .ifPresent(
+ commit -> {
+ deletedLbl.setText(String.valueOf(commit.isDeleted()));
+ segCntLbl.setText(String.valueOf(commit.getSegCount()));
+ userDataTA.setText(commit.getUserData());
+ });
filesTable.setModel(new FilesTableModel(commitsModel.getFiles(commitGen)));
filesTable.setShowGrid(true);
- filesTable.getColumnModel().getColumn(FilesTableModel.Column.FILENAME.getIndex()).setPreferredWidth(FilesTableModel.Column.FILENAME.getColumnWidth());
+ filesTable
+ .getColumnModel()
+ .getColumn(FilesTableModel.Column.FILENAME.getIndex())
+ .setPreferredWidth(FilesTableModel.Column.FILENAME.getColumnWidth());
segmentsTable.setModel(new SegmentsTableModel(commitsModel.getSegments(commitGen)));
segmentsTable.setShowGrid(true);
- segmentsTable.getColumnModel().getColumn(SegmentsTableModel.Column.NAME.getIndex()).setPreferredWidth(SegmentsTableModel.Column.NAME.getColumnWidth());
- segmentsTable.getColumnModel().getColumn(SegmentsTableModel.Column.MAXDOCS.getIndex()).setPreferredWidth(SegmentsTableModel.Column.MAXDOCS.getColumnWidth());
- segmentsTable.getColumnModel().getColumn(SegmentsTableModel.Column.DELS.getIndex()).setPreferredWidth(SegmentsTableModel.Column.DELS.getColumnWidth());
- segmentsTable.getColumnModel().getColumn(SegmentsTableModel.Column.DELGEN.getIndex()).setPreferredWidth(SegmentsTableModel.Column.DELGEN.getColumnWidth());
- segmentsTable.getColumnModel().getColumn(SegmentsTableModel.Column.VERSION.getIndex()).setPreferredWidth(SegmentsTableModel.Column.VERSION.getColumnWidth());
- segmentsTable.getColumnModel().getColumn(SegmentsTableModel.Column.CODEC.getIndex()).setPreferredWidth(SegmentsTableModel.Column.CODEC.getColumnWidth());
+ segmentsTable
+ .getColumnModel()
+ .getColumn(SegmentsTableModel.Column.NAME.getIndex())
+ .setPreferredWidth(SegmentsTableModel.Column.NAME.getColumnWidth());
+ segmentsTable
+ .getColumnModel()
+ .getColumn(SegmentsTableModel.Column.MAXDOCS.getIndex())
+ .setPreferredWidth(SegmentsTableModel.Column.MAXDOCS.getColumnWidth());
+ segmentsTable
+ .getColumnModel()
+ .getColumn(SegmentsTableModel.Column.DELS.getIndex())
+ .setPreferredWidth(SegmentsTableModel.Column.DELS.getColumnWidth());
+ segmentsTable
+ .getColumnModel()
+ .getColumn(SegmentsTableModel.Column.DELGEN.getIndex())
+ .setPreferredWidth(SegmentsTableModel.Column.DELGEN.getColumnWidth());
+ segmentsTable
+ .getColumnModel()
+ .getColumn(SegmentsTableModel.Column.VERSION.getIndex())
+ .setPreferredWidth(SegmentsTableModel.Column.VERSION.getColumnWidth());
+ segmentsTable
+ .getColumnModel()
+ .getColumn(SegmentsTableModel.Column.CODEC.getIndex())
+ .setPreferredWidth(SegmentsTableModel.Column.CODEC.getColumnWidth());
}
private void showSegmentDetails() {
int selectedRow = segmentsTable.getSelectedRow();
- if (commitGenCombo.getSelectedItem() == null ||
- selectedRow < 0 || selectedRow >= segmentsTable.getRowCount()) {
+ if (commitGenCombo.getSelectedItem() == null
+ || selectedRow < 0
+ || selectedRow >= segmentsTable.getRowCount()) {
return;
}
@@ -328,7 +369,8 @@ public final class CommitsPanelProvider {
codecRB.setEnabled(true);
long commitGen = (long) commitGenCombo.getSelectedItem();
- String segName = (String) segmentsTable.getValueAt(selectedRow, SegmentsTableModel.Column.NAME.getIndex());
+ String segName =
+ (String) segmentsTable.getValueAt(selectedRow, SegmentsTableModel.Column.NAME.getIndex());
ActionCommand command = ActionCommand.valueOf(rbGroup.getSelection().getActionCommand());
final DefaultListModel<String> detailsModel = new DefaultListModel<>();
@@ -344,27 +386,30 @@ public final class CommitsPanelProvider {
.forEach(detailsModel::addElement);
break;
case CODEC:
- commitsModel.getSegmentCodec(commitGen, segName).ifPresent(codec -> {
- Map<String, String> map = new HashMap<>();
- map.put("Codec name", codec.getName());
- map.put("Codec class name", codec.getClass().getName());
- map.put("Compound format", codec.compoundFormat().getClass().getName());
- map.put("DocValues format", codec.docValuesFormat().getClass().getName());
- map.put("FieldInfos format", codec.fieldInfosFormat().getClass().getName());
- map.put("LiveDocs format", codec.liveDocsFormat().getClass().getName());
- map.put("Norms format", codec.normsFormat().getClass().getName());
- map.put("Points format", codec.pointsFormat().getClass().getName());
- map.put("Postings format", codec.postingsFormat().getClass().getName());
- map.put("SegmentInfo format", codec.segmentInfoFormat().getClass().getName());
- map.put("StoredFields format", codec.storedFieldsFormat().getClass().getName());
- map.put("TermVectors format", codec.termVectorsFormat().getClass().getName());
- map.entrySet().stream()
- .map(entry -> entry.getKey() + " = " + entry.getValue()).forEach(detailsModel::addElement);
- });
+ commitsModel
+ .getSegmentCodec(commitGen, segName)
+ .ifPresent(
+ codec -> {
+ Map<String, String> map = new HashMap<>();
+ map.put("Codec name", codec.getName());
+ map.put("Codec class name", codec.getClass().getName());
+ map.put("Compound format", codec.compoundFormat().getClass().getName());
+ map.put("DocValues format", codec.docValuesFormat().getClass().getName());
+ map.put("FieldInfos format", codec.fieldInfosFormat().getClass().getName());
+ map.put("LiveDocs format", codec.liveDocsFormat().getClass().getName());
+ map.put("Norms format", codec.normsFormat().getClass().getName());
+ map.put("Points format", codec.pointsFormat().getClass().getName());
+ map.put("Postings format", codec.postingsFormat().getClass().getName());
+ map.put("SegmentInfo format", codec.segmentInfoFormat().getClass().getName());
+ map.put("StoredFields format", codec.storedFieldsFormat().getClass().getName());
+ map.put("TermVectors format", codec.termVectorsFormat().getClass().getName());
+ map.entrySet().stream()
+ .map(entry -> entry.getKey() + " = " + entry.getValue())
+ .forEach(detailsModel::addElement);
+ });
break;
}
segDetailList.setModel(detailsModel);
-
}
private class ListenerFunctions {
@@ -376,7 +421,6 @@ public final class CommitsPanelProvider {
void showSegmentDetails(MouseEvent e) {
CommitsPanelProvider.this.showSegmentDetails();
}
-
}
private class Observer implements IndexObserver, DirectoryObserver {
@@ -425,8 +469,17 @@ public final class CommitsPanelProvider {
deletedLbl.setText("");
segCntLbl.setText("");
userDataTA.setText("");
- TableUtils.setupTable(filesTable, ListSelectionModel.SINGLE_SELECTION, new FilesTableModel(), null, FilesTableModel.Column.FILENAME.getColumnWidth());
- TableUtils.setupTable(segmentsTable, ListSelectionModel.SINGLE_SELECTION, new SegmentsTableModel(), null,
+ TableUtils.setupTable(
+ filesTable,
+ ListSelectionModel.SINGLE_SELECTION,
+ new FilesTableModel(),
+ null,
+ FilesTableModel.Column.FILENAME.getColumnWidth());
+ TableUtils.setupTable(
+ segmentsTable,
+ ListSelectionModel.SINGLE_SELECTION,
+ new SegmentsTableModel(),
+ null,
SegmentsTableModel.Column.NAME.getColumnWidth(),
SegmentsTableModel.Column.MAXDOCS.getColumnWidth(),
SegmentsTableModel.Column.DELS.getColumnWidth(),
@@ -441,13 +494,14 @@ public final class CommitsPanelProvider {
}
enum ActionCommand {
- DIAGNOSTICS, ATTRIBUTES, CODEC;
+ DIAGNOSTICS,
+ ATTRIBUTES,
+ CODEC;
}
static final class FilesTableModel extends TableModelBase<FilesTableModel.Column> {
enum Column implements TableColumnInfo {
-
FILENAME("Filename", 0, String.class, 200),
SIZE("Size", 1, String.class, Integer.MAX_VALUE);
@@ -506,7 +560,6 @@ public final class CommitsPanelProvider {
static final class SegmentsTableModel extends TableModelBase<SegmentsTableModel.Column> {
enum Column implements TableColumnInfo {
-
NAME("Name", 0, String.class, 60),
MAXDOCS("Max docs", 1, Integer.class, 60),
DELS("Dels", 2, Integer.class, 60),
@@ -572,4 +625,3 @@ public final class CommitsPanelProvider {
}
}
}
-
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/ComponentOperatorRegistry.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/ComponentOperatorRegistry.java
index 0d9c99b..40eb735 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/ComponentOperatorRegistry.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/ComponentOperatorRegistry.java
@@ -44,7 +44,5 @@ public class ComponentOperatorRegistry {
}
/** marker interface for operators */
- public interface ComponentOperator {
- }
-
+ public interface ComponentOperator {}
}
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/DocumentsPanelProvider.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/DocumentsPanelProvider.java
index e9daece..85ca168 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/DocumentsPanelProvider.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/DocumentsPanelProvider.java
@@ -17,26 +17,6 @@
package org.apache.lucene.luke.app.desktop.components;
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.JSpinner;
-import javax.swing.JSplitPane;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.ListSelectionModel;
-import javax.swing.SpinnerModel;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.table.TableCellRenderer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
@@ -57,7 +37,26 @@ import java.math.BigInteger;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
-
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.JSpinner;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+import javax.swing.SpinnerModel;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.table.TableCellRenderer;
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.IndexOptions;
import org.apache.lucene.index.Term;
@@ -152,26 +151,30 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
this.dvDialogFactory = DocValuesDialogFactory.getInstance();
this.valueDialogFactory = StoredValueDialogFactory.getInstance();
HelpDialogFactory helpDialogFactory = HelpDialogFactory.getInstance();
- this.tableHeaderRenderer = new HelpHeaderRenderer(
- "About Flags", "Format: IdfpoNPSB#txxVDtxxxxTx/x",
- createFlagsHelpDialog(), helpDialogFactory);
+ this.tableHeaderRenderer =
+ new HelpHeaderRenderer(
+ "About Flags",
+ "Format: IdfpoNPSB#txxVDtxxxxTx/x",
+ createFlagsHelpDialog(),
+ helpDialogFactory);
IndexHandler.getInstance().addObserver(new Observer());
operatorRegistry.register(DocumentsTabOperator.class, this);
}
private JComponent createFlagsHelpDialog() {
- String[] values = new String[]{
- "I - index options(docs, frequencies, positions, offsets)",
- "N - norms",
- "P - payloads",
- "S - stored",
- "B - binary stored values",
- "#txx - numeric stored values(type, precision)",
- "V - term vectors",
- "Dtxxxxx - doc values(type)",
- "Tx/x - point values(num bytes/dimension)"
- };
+ String[] values =
+ new String[] {
+ "I - index options(docs, frequencies, positions, offsets)",
+ "N - norms",
+ "P - payloads",
+ "S - stored",
+ "B - binary stored values",
+ "#txx - numeric stored values(type, precision)",
+ "V - term vectors",
+ "Dtxxxxx - doc values(type)",
+ "Tx/x - point values(num bytes/dimension)"
+ };
JList<String> list = new JList<>(values);
return new JScrollPane(list);
}
@@ -181,7 +184,8 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
panel.setOpaque(false);
panel.setBorder(BorderFactory.createLineBorder(Color.gray));
- JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, initUpperPanel(), initLowerPanel());
+ JSplitPane splitPane =
+ new JSplitPane(JSplitPane.VERTICAL_SPLIT, initUpperPanel(), initLowerPanel());
splitPane.setOpaque(false);
splitPane.setDividerLocation(0.4);
panel.add(splitPane);
@@ -238,7 +242,9 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
c.gridwidth = 2;
center.add(fieldsCombo, c);
- firstTermBtn.setText(FontUtils.elegantIconHtml("8", MessageUtils.getLocalizedMessage("documents.button.first_term")));
+ firstTermBtn.setText(
+ FontUtils.elegantIconHtml(
+ "8", MessageUtils.getLocalizedMessage("documents.button.first_term")));
firstTermBtn.setMaximumSize(new Dimension(80, 30));
firstTermBtn.addActionListener(listeners::showFirstTerm);
c.gridx = 0;
@@ -272,7 +278,8 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
JPanel footer = new JPanel(new FlowLayout(FlowLayout.LEADING, 20, 5));
footer.setOpaque(false);
- JLabel hintLbl = new JLabel(MessageUtils.getLocalizedMessage("documents.label.browse_terms_hint"));
+ JLabel hintLbl =
+ new JLabel(MessageUtils.getLocalizedMessage("documents.label.browse_terms_hint"));
footer.add(hintLbl);
panel.add(footer, BorderLayout.PAGE_END);
@@ -289,7 +296,8 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
- JLabel label = new JLabel(MessageUtils.getLocalizedMessage("documents.label.browse_doc_by_term"));
+ JLabel label =
+ new JLabel(MessageUtils.getLocalizedMessage("documents.label.browse_doc_by_term"));
c.gridx = 0;
c.gridy = 0;
c.weightx = 0.0;
@@ -308,7 +316,9 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
c.insets = new Insets(5, 5, 5, 5);
center.add(selectedTermTF, c);
- firstTermDocBtn.setText(FontUtils.elegantIconHtml("8", MessageUtils.getLocalizedMessage("documents.button.first_termdoc")));
+ firstTermDocBtn.setText(
+ FontUtils.elegantIconHtml(
+ "8", MessageUtils.getLocalizedMessage("documents.button.first_termdoc")));
firstTermDocBtn.addActionListener(listeners::showFirstTermDoc);
c.gridx = 0;
c.gridy = 2;
@@ -343,8 +353,14 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
c.insets = new Insets(5, 5, 5, 5);
center.add(termDocsNumLbl, c);
- TableUtils.setupTable(posTable, ListSelectionModel.SINGLE_SELECTION, new PosTableModel(), null,
- PosTableModel.Column.POSITION.getColumnWidth(), PosTableModel.Column.OFFSETS.getColumnWidth(), PosTableModel.Column.PAYLOAD.getColumnWidth());
+ TableUtils.setupTable(
+ posTable,
+ ListSelectionModel.SINGLE_SELECTION,
+ new PosTableModel(),
+ null,
+ PosTableModel.Column.POSITION.getColumnWidth(),
+ PosTableModel.Column.OFFSETS.getColumnWidth(),
+ PosTableModel.Column.PAYLOAD.getColumnWidth());
JScrollPane scrollPane = new JScrollPane(posTable);
scrollPane.setMinimumSize(new Dimension(100, 100));
c.gridx = 0;
@@ -370,17 +386,23 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
JPanel browseDocsNote1 = new JPanel(new FlowLayout(FlowLayout.LEADING));
browseDocsNote1.setOpaque(false);
- browseDocsNote1.add(new JLabel(MessageUtils.getLocalizedMessage("documents.label.doc_table_note1")));
+ browseDocsNote1.add(
+ new JLabel(MessageUtils.getLocalizedMessage("documents.label.doc_table_note1")));
browseDocsPanel.add(browseDocsNote1);
JPanel browseDocsNote2 = new JPanel(new FlowLayout(FlowLayout.LEADING));
browseDocsNote2.setOpaque(false);
- browseDocsNote2.add(new JLabel(MessageUtils.getLocalizedMessage("documents.label.doc_table_note2")));
+ browseDocsNote2.add(
+ new JLabel(MessageUtils.getLocalizedMessage("documents.label.doc_table_note2")));
browseDocsPanel.add(browseDocsNote2);
panel.add(browseDocsPanel, BorderLayout.PAGE_START);
- TableUtils.setupTable(documentTable, ListSelectionModel.MULTIPLE_INTERVAL_SELECTION, new DocumentsTableModel(), new MouseAdapter() {
+ TableUtils.setupTable(
+ documentTable,
+ ListSelectionModel.MULTIPLE_INTERVAL_SELECTION,
+ new DocumentsTableModel(),
+ new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
listeners.showDocumentContextMenu(e);
@@ -394,7 +416,10 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
flagsHeader.setOpaque(false);
flagsHeader.add(new JLabel("Flags"));
flagsHeader.add(new JLabel("Help"));
- documentTable.getColumnModel().getColumn(DocumentsTableModel.Column.FLAGS.getIndex()).setHeaderValue(flagsHeader);
+ documentTable
+ .getColumnModel()
+ .getColumn(DocumentsTableModel.Column.FLAGS.getIndex())
+ .setHeaderValue(flagsHeader);
JScrollPane scrollPane = new JScrollPane(documentTable);
scrollPane.getHorizontalScrollBar().setAutoscrolls(false);
@@ -410,7 +435,10 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
JPanel left = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 2));
left.setOpaque(false);
- JLabel label = new JLabel(FontUtils.elegantIconHtml("h", MessageUtils.getLocalizedMessage("documents.label.browse_doc_by_idx")));
+ JLabel label =
+ new JLabel(
+ FontUtils.elegantIconHtml(
+ "h", MessageUtils.getLocalizedMessage("documents.label.browse_doc_by_idx")));
label.setHorizontalTextPosition(JLabel.LEFT);
left.add(label);
docNumSpnr.setPreferredSize(new Dimension(100, 25));
@@ -422,15 +450,21 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
JPanel right = new JPanel(new FlowLayout(FlowLayout.TRAILING));
right.setOpaque(false);
- copyDocValuesBtn.setText(FontUtils.elegantIconHtml("", MessageUtils.getLocalizedMessage("documents.buttont.copy_values")));
+ copyDocValuesBtn.setText(
+ FontUtils.elegantIconHtml(
+ "", MessageUtils.getLocalizedMessage("documents.buttont.copy_values")));
copyDocValuesBtn.setMargin(new Insets(5, 0, 5, 0));
copyDocValuesBtn.addActionListener(listeners::copySelectedOrAllStoredValues);
right.add(copyDocValuesBtn);
- mltBtn.setText(FontUtils.elegantIconHtml("", MessageUtils.getLocalizedMessage("documents.button.mlt")));
+ mltBtn.setText(
+ FontUtils.elegantIconHtml(
+ "", MessageUtils.getLocalizedMessage("documents.button.mlt")));
mltBtn.setMargin(new Insets(5, 0, 5, 0));
mltBtn.addActionListener(listeners::mltSearch);
right.add(mltBtn);
- addDocBtn.setText(FontUtils.elegantIconHtml("Y", MessageUtils.getLocalizedMessage("documents.button.add")));
+ addDocBtn.setText(
+ FontUtils.elegantIconHtml(
+ "Y", MessageUtils.getLocalizedMessage("documents.button.add")));
addDocBtn.setMargin(new Insets(5, 0, 5, 0));
addDocBtn.addActionListener(listeners::showAddDocumentDialog);
right.add(addDocBtn);
@@ -441,22 +475,26 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
private void setUpDocumentContextMenu() {
// show term vector
- JMenuItem item1 = new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item1"));
+ JMenuItem item1 =
+ new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item1"));
item1.addActionListener(listeners::showTermVectorDialog);
documentContextMenu.add(item1);
// show doc values
- JMenuItem item2 = new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item2"));
+ JMenuItem item2 =
+ new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item2"));
item2.addActionListener(listeners::showDocValuesDialog);
documentContextMenu.add(item2);
// show stored value
- JMenuItem item3 = new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item3"));
+ JMenuItem item3 =
+ new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item3"));
item3.addActionListener(listeners::showStoredValueDialog);
documentContextMenu.add(item3);
// copy stored value to clipboard
- JMenuItem item4 = new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item4"));
+ JMenuItem item4 =
+ new JMenuItem(MessageUtils.getLocalizedMessage("documents.doctable.menu.item4"));
item4.addActionListener(listeners::copyStoredValue);
documentContextMenu.add(item4);
}
@@ -466,7 +504,8 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
private void showFirstTerm() {
String fieldName = (String) fieldsCombo.getSelectedItem();
if (fieldName == null || fieldName.length() == 0) {
- messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("documents.field.message.not_selected"));
+ messageBroker.showStatusMessage(
+ MessageUtils.getLocalizedMessage("documents.field.message.not_selected"));
return;
}
@@ -542,9 +581,12 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
messageBroker.clearStatusMessage();
}
-
private void clearPosTable() {
- TableUtils.setupTable(posTable, ListSelectionModel.SINGLE_SELECTION, new PosTableModel(), null,
+ TableUtils.setupTable(
+ posTable,
+ ListSelectionModel.SINGLE_SELECTION,
+ new PosTableModel(),
+ null,
PosTableModel.Column.POSITION.getColumnWidth(),
PosTableModel.Column.OFFSETS.getColumnWidth(),
PosTableModel.Column.PAYLOAD.getColumnWidth());
@@ -555,7 +597,8 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
int docid = documentsModel.firstTermDoc().orElse(-1);
if (docid < 0) {
nextTermDocBtn.setEnabled(false);
- messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("documents.termdocs.message.not_available"));
+ messageBroker.showStatusMessage(
+ MessageUtils.getLocalizedMessage("documents.termdocs.message.not_available"));
return;
}
termDocIdxTF.setText(String.valueOf(1));
@@ -563,9 +606,18 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
List<TermPosting> postings = documentsModel.getTermPositions();
posTable.setModel(new PosTableModel(postings));
- posTable.getColumnModel().getColumn(PosTableModel.Column.POSITION.getIndex()).setPreferredWidth(PosTableModel.Column.POSITION.getColumnWidth());
- posTable.getColumnModel().getColumn(PosTableModel.Column.OFFSETS.getIndex()).setPreferredWidth(PosTableModel.Column.OFFSETS.getColumnWidth());
- posTable.getColumnModel().getColumn(PosTableModel.Column.PAYLOAD.getIndex()).setPreferredWidth(PosTableModel.Column.PAYLOAD.getColumnWidth());
+ posTable
+ .getColumnModel()
+ .getColumn(PosTableModel.Column.POSITION.getIndex())
+ .setPreferredWidth(PosTableModel.Column.POSITION.getColumnWidth());
+ posTable
+ .getColumnModel()
+ .getColumn(PosTableModel.Column.OFFSETS.getIndex())
+ .setPreferredWidth(PosTableModel.Column.OFFSETS.getColumnWidth());
+ posTable
+ .getColumnModel()
+ .getColumn(PosTableModel.Column.PAYLOAD.getIndex())
+ .setPreferredWidth(PosTableModel.Column.PAYLOAD.getColumnWidth());
nextTermDocBtn.setEnabled(true);
messageBroker.clearStatusMessage();
@@ -575,7 +627,8 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
int docid = documentsModel.nextTermDoc().orElse(-1);
if (docid < 0) {
nextTermDocBtn.setEnabled(false);
- messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("documents.termdocs.message.not_available"));
+ messageBroker.showStatusMessage(
+ MessageUtils.getLocalizedMessage("documents.termdocs.message.not_available"));
return;
}
int curIdx = Integer.parseInt(termDocIdxTF.getText());
@@ -596,75 +649,121 @@ public final class DocumentsPanelProvider implements DocumentsTabOperator {
private void mltSearch() {
int docNum = (int) docNumSpnr.getValue();
- operatorRegistry.get(SearchTabOperator.class).ifPresent(operator -> {
- operator.mltSearch(docNum);
- tabSwitcher.switchTab(TabbedPaneProvider.Tab.SEARCH);
- });
+ operatorRegistry
+ .get(SearchTabOperator.class)
+ .ifPresent(
+ operator -> {
+ operator.mltSearch(docNum);
+ tabSwitcher.switchTab(TabbedPaneProvider.Tab.SEARCH);
+ });
}
private void showAddDocumentDialog() {
- new DialogOpener<>(addDocDialogFactory).open("Add document", 600, 500,
- (factory) -> {
- });
+ new DialogOpener<>(addDocDialogFactory).open("Add document", 600, 500, (factory) -> {});
}
private void showTermVectorDialog() {
int docid = (Integer) docNumSpnr.getValue();
- String field = (String) documentTable.getModel().getValueAt(documentTable.getSelectedRow(), DocumentsTableModel.Column.FIELD.getIndex());
+ String field =
+ (String)
+ documentTable
+ .getModel()
+ .getValueAt(
+ documentTable.getSelectedRow(), DocumentsTableModel.Column.FIELD.getIndex());
List<TermVectorEntry> tvEntries = documentsModel.getTermVectors(docid, field);
if (tvEntries.isEmpty()) {
- messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("documents.termvector.message.not_available", field, docid));
+ messageBroker.showStatusMessage(
+ MessageUtils.getLocalizedMessage(
+ "documents.termvector.message.not_available", field, docid));
return;
}
- new DialogOpener<>(tvDialogFactory).open(
- "Term Vector", 600, 400,
- (factory) -> {
- factory.setField(field);
- factory.setTvEntries(tvEntries);
- });
+ new DialogOpener<>(tvDialogFactory)
+ .open(
... 201562 lines suppressed ...