mirror of https://github.com/apache/lucene.git
Merge branch 'apache-https-master' into jira/solr-8593
This commit is contained in:
commit
82350229c9
40
build.xml
40
build.xml
|
@ -138,6 +138,7 @@
|
||||||
'java', 'jflex', 'py', 'pl', 'g4', 'jj', 'html', 'js',
|
'java', 'jflex', 'py', 'pl', 'g4', 'jj', 'html', 'js',
|
||||||
'css', 'xml', 'xsl', 'vm', 'sh', 'cmd', 'bat', 'policy',
|
'css', 'xml', 'xsl', 'vm', 'sh', 'cmd', 'bat', 'policy',
|
||||||
'properties', 'mdtext',
|
'properties', 'mdtext',
|
||||||
|
'template',
|
||||||
];
|
];
|
||||||
def invalidPatterns = [
|
def invalidPatterns = [
|
||||||
(~$/@author\b/$) : '@author javadoc tag',
|
(~$/@author\b/$) : '@author javadoc tag',
|
||||||
|
@ -166,17 +167,36 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
def javadocsPattern = ~$/(?sm)^\Q/**\E(.*?)\Q*/\E/$;
|
def javadocsPattern = ~$/(?sm)^\Q/**\E(.*?)\Q*/\E/$;
|
||||||
def commentPattern = ~$/(?sm)^\Q/*\E(.*?)\Q*/\E/$;
|
def javaCommentPattern = ~$/(?sm)^\Q/*\E(.*?)\Q*/\E/$;
|
||||||
|
def xmlCommentPattern = ~$/(?sm)\Q<!--\E(.*?)\Q-->\E/$;
|
||||||
def lineSplitter = ~$/[\r\n]+/$;
|
def lineSplitter = ~$/[\r\n]+/$;
|
||||||
def licenseMatcher = Defaults.createDefaultMatcher();
|
def licenseMatcher = Defaults.createDefaultMatcher();
|
||||||
def validLoggerPattern = ~$/(?s)\b(private\s|static\s|final\s){3}+\s*Logger\s+\p{javaJavaIdentifierStart}+\s+=\s+\QLoggerFactory.getLogger(MethodHandles.lookup().lookupClass());\E/$;
|
def validLoggerPattern = ~$/(?s)\b(private\s|static\s|final\s){3}+\s*Logger\s+\p{javaJavaIdentifierStart}+\s+=\s+\QLoggerFactory.getLogger(MethodHandles.lookup().lookupClass());\E/$;
|
||||||
def packagePattern = ~$/(?m)^\s*package\s+org\.apache.*;/$;
|
def packagePattern = ~$/(?m)^\s*package\s+org\.apache.*;/$;
|
||||||
|
def xmlTagPattern = ~$/(?m)\s*<[a-zA-Z].*/$;
|
||||||
|
|
||||||
def isLicense = { matcher, ratDocument ->
|
def isLicense = { matcher, ratDocument ->
|
||||||
licenseMatcher.reset();
|
licenseMatcher.reset();
|
||||||
return lineSplitter.split(matcher.group(1)).any{ licenseMatcher.match(ratDocument, it) };
|
return lineSplitter.split(matcher.group(1)).any{ licenseMatcher.match(ratDocument, it) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def checkLicenseHeaderPrecedes = { f, description, contentPattern, commentPattern, text, ratDocument ->
|
||||||
|
def contentMatcher = contentPattern.matcher(text);
|
||||||
|
if (contentMatcher.find()) {
|
||||||
|
def contentStartPos = contentMatcher.start();
|
||||||
|
def commentMatcher = commentPattern.matcher(text);
|
||||||
|
while (commentMatcher.find()) {
|
||||||
|
if (isLicense(commentMatcher, ratDocument)) {
|
||||||
|
if (commentMatcher.start() < contentStartPos) {
|
||||||
|
break; // This file is all good, so break loop: license header precedes 'description' definition
|
||||||
|
} else {
|
||||||
|
reportViolation(f, description+' declaration precedes license header');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ant.fileScanner{
|
ant.fileScanner{
|
||||||
fileset(dir: baseDir){
|
fileset(dir: baseDir){
|
||||||
extensions.each{
|
extensions.each{
|
||||||
|
@ -219,20 +239,10 @@
|
||||||
reportViolation(f, 'invalid logging pattern [not private static final, uses static class name]');
|
reportViolation(f, 'invalid logging pattern [not private static final, uses static class name]');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
def packageMatcher = packagePattern.matcher(text);
|
checkLicenseHeaderPrecedes(f, 'package', packagePattern, javaCommentPattern, text, ratDocument);
|
||||||
if (packageMatcher.find()) {
|
}
|
||||||
def packageStartPos = packageMatcher.start();
|
if (f.toString().endsWith('.xml') || f.toString().endsWith('.xml.template')) {
|
||||||
def commentMatcher = commentPattern.matcher(text);
|
checkLicenseHeaderPrecedes(f, '<tag>', xmlTagPattern, xmlCommentPattern, text, ratDocument);
|
||||||
while (commentMatcher.find()) {
|
|
||||||
if (isLicense(commentMatcher, ratDocument)) {
|
|
||||||
if (commentMatcher.start() < packageStartPos) {
|
|
||||||
break; // This file is all good, so break loop: license header precedes package definition
|
|
||||||
} else {
|
|
||||||
reportViolation(f, 'package declaration precedes license header');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
<orderEntry type="module" scope="TEST" module-name="lucene-test-framework" />
|
<orderEntry type="module" scope="TEST" module-name="lucene-test-framework" />
|
||||||
<orderEntry type="module" module-name="queries" />
|
<orderEntry type="module" module-name="queries" />
|
||||||
<orderEntry type="module" module-name="analysis-common" />
|
<orderEntry type="module" module-name="analysis-common" />
|
||||||
<orderEntry type="module" module-name="misc" />
|
|
||||||
<orderEntry type="module" module-name="lucene-core" />
|
<orderEntry type="module" module-name="lucene-core" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
@ -31,8 +31,8 @@
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>Lucene ICU Analysis Components</name>
|
<name>Lucene ICU Analysis Components</name>
|
||||||
<description>
|
<description>
|
||||||
Provides integration with ICU (International Components for Unicode) for
|
Provides integration with ICU (International Components for Unicode) for
|
||||||
stronger Unicode and internationalization support.
|
stronger Unicode and internationalization support.
|
||||||
</description>
|
</description>
|
||||||
<properties>
|
<properties>
|
||||||
<module-directory>lucene/analysis/icu</module-directory>
|
<module-directory>lucene/analysis/icu</module-directory>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>Lucene Kuromoji Japanese Morphological Analyzer</name>
|
<name>Lucene Kuromoji Japanese Morphological Analyzer</name>
|
||||||
<description>
|
<description>
|
||||||
Lucene Kuromoji Japanese Morphological Analyzer
|
Lucene Kuromoji Japanese Morphological Analyzer
|
||||||
</description>
|
</description>
|
||||||
<properties>
|
<properties>
|
||||||
<module-directory>lucene/analysis/kuromoji</module-directory>
|
<module-directory>lucene/analysis/kuromoji</module-directory>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>Lucene Morfologik Polish Lemmatizer</name>
|
<name>Lucene Morfologik Polish Lemmatizer</name>
|
||||||
<description>
|
<description>
|
||||||
A dictionary-driven lemmatizer for Polish (includes morphosyntactic annotations)
|
A dictionary-driven lemmatizer for Polish (includes morphosyntactic annotations)
|
||||||
</description>
|
</description>
|
||||||
<properties>
|
<properties>
|
||||||
<module-directory>lucene/analysis/morfologik</module-directory>
|
<module-directory>lucene/analysis/morfologik</module-directory>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>Lucene Phonetic Filters</name>
|
<name>Lucene Phonetic Filters</name>
|
||||||
<description>
|
<description>
|
||||||
Provides phonetic encoding via Commons Codec.
|
Provides phonetic encoding via Commons Codec.
|
||||||
</description>
|
</description>
|
||||||
<properties>
|
<properties>
|
||||||
<module-directory>lucene/analysis/phonetic</module-directory>
|
<module-directory>lucene/analysis/phonetic</module-directory>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
<modelVersion>4.0.0</modelVersion>
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
<artifactId>lucene-parent</artifactId>
|
<artifactId>lucene-parent</artifactId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>Lucene Spatial</name>
|
<name>Lucene Spatial</name>
|
||||||
<description>
|
<description>
|
||||||
Geospatial Indexing and Query for Apache Lucene
|
Geospatial Indexing and Query for Apache Lucene
|
||||||
</description>
|
</description>
|
||||||
<properties>
|
<properties>
|
||||||
<module-directory>lucene/spatial</module-directory>
|
<module-directory>lucene/spatial</module-directory>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache</groupId>
|
<groupId>org.apache</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
-->
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.solr</groupId>
|
<groupId>org.apache.solr</groupId>
|
||||||
|
|
|
@ -65,6 +65,9 @@ API Changes
|
||||||
* LUCENE-7533: Classic query parser no longer allows autoGeneratePhraseQueries
|
* LUCENE-7533: Classic query parser no longer allows autoGeneratePhraseQueries
|
||||||
to be set to true when splitOnWhitespace is false (and vice-versa).
|
to be set to true when splitOnWhitespace is false (and vice-versa).
|
||||||
|
|
||||||
|
* LUCENE-7607: LeafFieldComparator.setScorer and SimpleFieldComparator.setScorer
|
||||||
|
are declared as throwing IOException (Alan Woodward)
|
||||||
|
|
||||||
New features
|
New features
|
||||||
|
|
||||||
* LUCENE-5867: Added BooleanSimilarity. (Robert Muir, Adrien Grand)
|
* LUCENE-5867: Added BooleanSimilarity. (Robert Muir, Adrien Grand)
|
||||||
|
@ -78,6 +81,28 @@ New features
|
||||||
make it simpler to execute drill down when drill sideways counts are
|
make it simpler to execute drill down when drill sideways counts are
|
||||||
not needed (Emmanuel Keller via Mike McCandless)
|
not needed (Emmanuel Keller via Mike McCandless)
|
||||||
|
|
||||||
|
* LUCENE-6664: A new SynonymGraphFilter outputs a correct graph
|
||||||
|
structure for multi-token synonyms, separating out a
|
||||||
|
FlattenGraphFilter that is hardwired into the current
|
||||||
|
SynonymFilter. This finally makes it possible to implement
|
||||||
|
correct multi-token synonyms at search time. See
|
||||||
|
http://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html
|
||||||
|
for details. (Mike McCandless)
|
||||||
|
|
||||||
|
* LUCENE-5325: Added LongValuesSource and DoubleValuesSource, intended as
|
||||||
|
type-safe replacements for ValueSource in the queries module. These
|
||||||
|
expose per-segment LongValues or DoubleValues iterators, similar to the
|
||||||
|
existing DocValues iterator API. (Alan Woodward, Adrien Grand)
|
||||||
|
|
||||||
|
* LUCENE-7603: Graph token streams are now handled accurately by query
|
||||||
|
parsers, by enumerating all paths and creating the corresponding
|
||||||
|
query/ies as sub-clauses (Matt Weber via Mike McCandless)
|
||||||
|
|
||||||
|
* LUCENE-7588: DrillSideways can now run queries concurrently, and
|
||||||
|
supports an IndexSearcher using an executor service to run each query
|
||||||
|
concurrently across all segments in the index (Emmanuel Keller via
|
||||||
|
Mike McCandless)
|
||||||
|
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
|
|
||||||
* LUCENE-7547: JapaneseTokenizerFactory was failing to close the
|
* LUCENE-7547: JapaneseTokenizerFactory was failing to close the
|
||||||
|
@ -109,6 +134,16 @@ Bug Fixes
|
||||||
there are too many merges running and one of the merges hits a
|
there are too many merges running and one of the merges hits a
|
||||||
tragic exception (Joey Echeverria via Mike McCandless)
|
tragic exception (Joey Echeverria via Mike McCandless)
|
||||||
|
|
||||||
|
* LUCENE-7594: Fixed point range queries on floating-point types to recommend
|
||||||
|
using helpers for exclusive bounds that are consistent with Double.compare.
|
||||||
|
(Adrien Grand, Dawid Weiss)
|
||||||
|
|
||||||
|
* LUCENE-7606: Normalization with CustomAnalyzer would only apply the last
|
||||||
|
token filter. (Adrien Grand)
|
||||||
|
|
||||||
|
* LUCENE-7612: Removed an unused dependency from the suggester to the misc
|
||||||
|
module. (Alan Woodward)
|
||||||
|
|
||||||
Improvements
|
Improvements
|
||||||
|
|
||||||
* LUCENE-6824: TermAutomatonQuery now rewrites to TermQuery,
|
* LUCENE-6824: TermAutomatonQuery now rewrites to TermQuery,
|
||||||
|
@ -153,6 +188,16 @@ Improvements
|
||||||
CorruptIndexException instead of the more confusing EOFException
|
CorruptIndexException instead of the more confusing EOFException
|
||||||
(Mike Drob via Mike McCandless)
|
(Mike Drob via Mike McCandless)
|
||||||
|
|
||||||
|
* LUCENE-6989: Make MMapDirectory's unmap hack work with Java 9 EA (b150+):
|
||||||
|
Unmapping uses new sun.misc.Unsafe#invokeCleaner(ByteBuffer).
|
||||||
|
Java 9 now needs same permissions like Java 8;
|
||||||
|
RuntimePermission("accessClassInPackage.jdk.internal.ref")
|
||||||
|
is no longer needed. Support for older Java 9 builds was removed.
|
||||||
|
(Uwe Schindler)
|
||||||
|
|
||||||
|
* LUCENE-7401: Changed the way BKD trees pick the split dimension in order to
|
||||||
|
ensure all dimensions are indexed. (Adrien Grand)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
|
|
||||||
* LUCENE-7568: Optimize merging when index sorting is used but the
|
* LUCENE-7568: Optimize merging when index sorting is used but the
|
||||||
|
@ -183,6 +228,13 @@ Other
|
||||||
* LUCENE-7559: UnifiedHighlighter: Make Passage more exposed to allow passage creation to
|
* LUCENE-7559: UnifiedHighlighter: Make Passage more exposed to allow passage creation to
|
||||||
be customized. (David Smiley)
|
be customized. (David Smiley)
|
||||||
|
|
||||||
|
* LUCENE-7599: Simplify TestRandomChains using Java's built-in Predicate and
|
||||||
|
Function interfaces. (Ahmet Arslan via Adrien Grand)
|
||||||
|
|
||||||
|
* LUCENE-7595: Improve RAMUsageTester in test-framework to estimate memory usage of
|
||||||
|
runtime classes and work with Java 9 EA (b148+). Disable static field heap usage
|
||||||
|
checker in LuceneTestCase. (Uwe Schindler, Dawid Weiss)
|
||||||
|
|
||||||
Build
|
Build
|
||||||
|
|
||||||
* LUCENE-7387: fix defaultCodec in build.xml to account for the line ending (hossman)
|
* LUCENE-7387: fix defaultCodec in build.xml to account for the line ending (hossman)
|
||||||
|
|
|
@ -145,7 +145,7 @@ public final class CustomAnalyzer extends Analyzer {
|
||||||
for (TokenFilterFactory filter : tokenFilters) {
|
for (TokenFilterFactory filter : tokenFilters) {
|
||||||
if (filter instanceof MultiTermAwareComponent) {
|
if (filter instanceof MultiTermAwareComponent) {
|
||||||
filter = (TokenFilterFactory) ((MultiTermAwareComponent) filter).getMultiTermComponent();
|
filter = (TokenFilterFactory) ((MultiTermAwareComponent) filter).getMultiTermComponent();
|
||||||
result = filter.create(in);
|
result = filter.create(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -0,0 +1,417 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.analysis.synonym;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.lucene.analysis.TokenFilter;
|
||||||
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.PositionLengthAttribute;
|
||||||
|
import org.apache.lucene.util.AttributeSource;
|
||||||
|
import org.apache.lucene.util.RollingBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts an incoming graph token stream, such as one from
|
||||||
|
* {@link SynonymGraphFilter}, into a flat form so that
|
||||||
|
* all nodes form a single linear chain with no side paths. Every
|
||||||
|
* path through the graph touches every node. This is necessary
|
||||||
|
* when indexing a graph token stream, because the index does not
|
||||||
|
* save {@link PositionLengthAttribute} and so it cannot
|
||||||
|
* preserve the graph structure. However, at search time,
|
||||||
|
* query parsers can correctly handle the graph and this token
|
||||||
|
* filter should <b>not</b> be used.
|
||||||
|
*
|
||||||
|
* <p>If the graph was not already flat to start, this
|
||||||
|
* is likely a lossy process, i.e. it will often cause the
|
||||||
|
* graph to accept token sequences it should not, and to
|
||||||
|
* reject token sequences it should not.
|
||||||
|
*
|
||||||
|
* <p>However, when applying synonyms during indexing, this
|
||||||
|
* is necessary because Lucene already does not index a graph
|
||||||
|
* and so the indexing process is already lossy
|
||||||
|
* (it ignores the {@link PositionLengthAttribute}).
|
||||||
|
*
|
||||||
|
* @lucene.experimental
|
||||||
|
*/
|
||||||
|
public final class FlattenGraphFilter extends TokenFilter {
|
||||||
|
|
||||||
|
/** Holds all tokens leaving a given input position. */
|
||||||
|
private final static class InputNode implements RollingBuffer.Resettable {
|
||||||
|
private final List<AttributeSource.State> tokens = new ArrayList<>();
|
||||||
|
|
||||||
|
/** Our input node, or -1 if we haven't been assigned yet */
|
||||||
|
int node = -1;
|
||||||
|
|
||||||
|
/** Maximum to input node for all tokens leaving here; we use this
|
||||||
|
* to know when we can freeze. */
|
||||||
|
int maxToNode = -1;
|
||||||
|
|
||||||
|
/** Where we currently map to; this changes (can only
|
||||||
|
* increase as we see more input tokens), until we are finished
|
||||||
|
* with this position. */
|
||||||
|
int outputNode = -1;
|
||||||
|
|
||||||
|
/** Which token (index into {@link #tokens}) we will next output. */
|
||||||
|
int nextOut;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
tokens.clear();
|
||||||
|
node = -1;
|
||||||
|
outputNode = -1;
|
||||||
|
maxToNode = -1;
|
||||||
|
nextOut = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gathers up merged input positions into a single output position,
|
||||||
|
* only for the current "frontier" of nodes we've seen but can't yet
|
||||||
|
* output because they are not frozen. */
|
||||||
|
private final static class OutputNode implements RollingBuffer.Resettable {
|
||||||
|
private final List<Integer> inputNodes = new ArrayList<>();
|
||||||
|
|
||||||
|
/** Node ID for this output, or -1 if we haven't been assigned yet. */
|
||||||
|
int node = -1;
|
||||||
|
|
||||||
|
/** Which input node (index into {@link #inputNodes}) we will next output. */
|
||||||
|
int nextOut;
|
||||||
|
|
||||||
|
/** Start offset of tokens leaving this node. */
|
||||||
|
int startOffset = -1;
|
||||||
|
|
||||||
|
/** End offset of tokens arriving to this node. */
|
||||||
|
int endOffset = -1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
inputNodes.clear();
|
||||||
|
node = -1;
|
||||||
|
nextOut = 0;
|
||||||
|
startOffset = -1;
|
||||||
|
endOffset = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final RollingBuffer<InputNode> inputNodes = new RollingBuffer<InputNode>() {
|
||||||
|
@Override
|
||||||
|
protected InputNode newInstance() {
|
||||||
|
return new InputNode();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final RollingBuffer<OutputNode> outputNodes = new RollingBuffer<OutputNode>() {
|
||||||
|
@Override
|
||||||
|
protected OutputNode newInstance() {
|
||||||
|
return new OutputNode();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final PositionIncrementAttribute posIncAtt = addAttribute(PositionIncrementAttribute.class);
|
||||||
|
private final PositionLengthAttribute posLenAtt = addAttribute(PositionLengthAttribute.class);
|
||||||
|
private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
|
||||||
|
|
||||||
|
/** Which input node the last seen token leaves from */
|
||||||
|
private int inputFrom;
|
||||||
|
|
||||||
|
/** We are currently releasing tokens leaving from this output node */
|
||||||
|
private int outputFrom;
|
||||||
|
|
||||||
|
// for debugging:
|
||||||
|
//private int retOutputFrom;
|
||||||
|
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
private int lastOutputFrom;
|
||||||
|
|
||||||
|
private int finalOffset;
|
||||||
|
|
||||||
|
private int finalPosInc;
|
||||||
|
|
||||||
|
private int maxLookaheadUsed;
|
||||||
|
|
||||||
|
private int lastStartOffset;
|
||||||
|
|
||||||
|
public FlattenGraphFilter(TokenStream in) {
|
||||||
|
super(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean releaseBufferedToken() {
|
||||||
|
|
||||||
|
// We only need the while loop (retry) if we have a hole (an output node that has no tokens leaving):
|
||||||
|
while (outputFrom < outputNodes.getMaxPos()) {
|
||||||
|
OutputNode output = outputNodes.get(outputFrom);
|
||||||
|
if (output.inputNodes.isEmpty()) {
|
||||||
|
// No tokens arrived to this node, which happens for the first node
|
||||||
|
// after a hole:
|
||||||
|
//System.out.println(" skip empty outputFrom=" + outputFrom);
|
||||||
|
outputFrom++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int maxToNode = -1;
|
||||||
|
for(int inputNodeID : output.inputNodes) {
|
||||||
|
InputNode inputNode = inputNodes.get(inputNodeID);
|
||||||
|
assert inputNode.outputNode == outputFrom;
|
||||||
|
maxToNode = Math.max(maxToNode, inputNode.maxToNode);
|
||||||
|
}
|
||||||
|
//System.out.println(" release maxToNode=" + maxToNode + " vs inputFrom=" + inputFrom);
|
||||||
|
|
||||||
|
// TODO: we could shrink the frontier here somewhat if we
|
||||||
|
// always output posLen=1 as part of our "sausagizing":
|
||||||
|
if (maxToNode <= inputFrom || done) {
|
||||||
|
//System.out.println(" output node merged these inputs: " + output.inputNodes);
|
||||||
|
// These tokens are now frozen
|
||||||
|
assert output.nextOut < output.inputNodes.size(): "output.nextOut=" + output.nextOut + " vs output.inputNodes.size()=" + output.inputNodes.size();
|
||||||
|
InputNode inputNode = inputNodes.get(output.inputNodes.get(output.nextOut));
|
||||||
|
if (done && inputNode.tokens.size() == 0 && outputFrom >= outputNodes.getMaxPos()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (inputNode.tokens.size() == 0) {
|
||||||
|
assert inputNode.nextOut == 0;
|
||||||
|
assert output.nextOut == 0;
|
||||||
|
// Hole dest nodes should never be merged since 1) we always
|
||||||
|
// assign them to a new output position, and 2) since they never
|
||||||
|
// have arriving tokens they cannot be pushed:
|
||||||
|
assert output.inputNodes.size() == 1: output.inputNodes.size();
|
||||||
|
outputFrom++;
|
||||||
|
inputNodes.freeBefore(output.inputNodes.get(0));
|
||||||
|
outputNodes.freeBefore(outputFrom);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert inputNode.nextOut < inputNode.tokens.size();
|
||||||
|
|
||||||
|
restoreState(inputNode.tokens.get(inputNode.nextOut));
|
||||||
|
|
||||||
|
// Correct posInc
|
||||||
|
assert outputFrom >= lastOutputFrom;
|
||||||
|
posIncAtt.setPositionIncrement(outputFrom - lastOutputFrom);
|
||||||
|
int toInputNodeID = inputNode.node + posLenAtt.getPositionLength();
|
||||||
|
InputNode toInputNode = inputNodes.get(toInputNodeID);
|
||||||
|
|
||||||
|
// Correct posLen
|
||||||
|
assert toInputNode.outputNode > outputFrom;
|
||||||
|
posLenAtt.setPositionLength(toInputNode.outputNode - outputFrom);
|
||||||
|
lastOutputFrom = outputFrom;
|
||||||
|
inputNode.nextOut++;
|
||||||
|
//System.out.println(" ret " + this);
|
||||||
|
|
||||||
|
OutputNode outputEndNode = outputNodes.get(toInputNode.outputNode);
|
||||||
|
|
||||||
|
// Correct offsets
|
||||||
|
|
||||||
|
// This is a bit messy; we must do this so offset don't go backwards,
|
||||||
|
// which would otherwise happen if the replacement has more tokens
|
||||||
|
// than the input:
|
||||||
|
int startOffset = Math.max(lastStartOffset, output.startOffset);
|
||||||
|
|
||||||
|
// We must do this in case the incoming tokens have broken offsets:
|
||||||
|
int endOffset = Math.max(startOffset, outputEndNode.endOffset);
|
||||||
|
|
||||||
|
offsetAtt.setOffset(startOffset, endOffset);
|
||||||
|
lastStartOffset = startOffset;
|
||||||
|
|
||||||
|
if (inputNode.nextOut == inputNode.tokens.size()) {
|
||||||
|
output.nextOut++;
|
||||||
|
if (output.nextOut == output.inputNodes.size()) {
|
||||||
|
outputFrom++;
|
||||||
|
inputNodes.freeBefore(output.inputNodes.get(0));
|
||||||
|
outputNodes.freeBefore(outputFrom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//System.out.println(" break false");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean incrementToken() throws IOException {
|
||||||
|
//System.out.println("\nF.increment inputFrom=" + inputFrom + " outputFrom=" + outputFrom);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (releaseBufferedToken()) {
|
||||||
|
//retOutputFrom += posIncAtt.getPositionIncrement();
|
||||||
|
//System.out.println(" return buffered: " + termAtt + " " + retOutputFrom + "-" + (retOutputFrom + posLenAtt.getPositionLength()));
|
||||||
|
//printStates();
|
||||||
|
return true;
|
||||||
|
} else if (done) {
|
||||||
|
//System.out.println(" done, return false");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.incrementToken()) {
|
||||||
|
// Input node this token leaves from:
|
||||||
|
inputFrom += posIncAtt.getPositionIncrement();
|
||||||
|
|
||||||
|
int startOffset = offsetAtt.startOffset();
|
||||||
|
int endOffset = offsetAtt.endOffset();
|
||||||
|
|
||||||
|
// Input node this token goes to:
|
||||||
|
int inputTo = inputFrom + posLenAtt.getPositionLength();
|
||||||
|
//System.out.println(" input.inc " + termAtt + ": " + inputFrom + "-" + inputTo);
|
||||||
|
|
||||||
|
InputNode src = inputNodes.get(inputFrom);
|
||||||
|
if (src.node == -1) {
|
||||||
|
// This means the "from" node of this token was never seen as a "to" node,
|
||||||
|
// which should only happen if we just crossed a hole. This is a challenging
|
||||||
|
// case for us because we normally rely on the full dependencies expressed
|
||||||
|
// by the arcs to assign outgoing node IDs. It would be better if tokens
|
||||||
|
// were never dropped but instead just marked deleted with a new
|
||||||
|
// TermDeletedAttribute (boolean valued) ... but until that future, we have
|
||||||
|
// a hack here to forcefully jump the output node ID:
|
||||||
|
assert src.outputNode == -1;
|
||||||
|
src.node = inputFrom;
|
||||||
|
|
||||||
|
src.outputNode = outputNodes.getMaxPos() + 1;
|
||||||
|
//System.out.println(" hole: force to outputNode=" + src.outputNode);
|
||||||
|
OutputNode outSrc = outputNodes.get(src.outputNode);
|
||||||
|
|
||||||
|
// Not assigned yet:
|
||||||
|
assert outSrc.node == -1;
|
||||||
|
outSrc.node = src.outputNode;
|
||||||
|
outSrc.inputNodes.add(inputFrom);
|
||||||
|
outSrc.startOffset = startOffset;
|
||||||
|
} else {
|
||||||
|
OutputNode outSrc = outputNodes.get(src.outputNode);
|
||||||
|
if (outSrc.startOffset == -1 || startOffset > outSrc.startOffset) {
|
||||||
|
// "shrink wrap" the offsets so the original tokens (with most
|
||||||
|
// restrictive offsets) win:
|
||||||
|
outSrc.startOffset = Math.max(startOffset, outSrc.startOffset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Buffer this token:
|
||||||
|
src.tokens.add(captureState());
|
||||||
|
src.maxToNode = Math.max(src.maxToNode, inputTo);
|
||||||
|
maxLookaheadUsed = Math.max(maxLookaheadUsed, inputNodes.getBufferSize());
|
||||||
|
|
||||||
|
InputNode dest = inputNodes.get(inputTo);
|
||||||
|
if (dest.node == -1) {
|
||||||
|
// Common case: first time a token is arriving to this input position:
|
||||||
|
dest.node = inputTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always number output nodes sequentially:
|
||||||
|
int outputEndNode = src.outputNode + 1;
|
||||||
|
|
||||||
|
if (outputEndNode > dest.outputNode) {
|
||||||
|
if (dest.outputNode != -1) {
|
||||||
|
boolean removed = outputNodes.get(dest.outputNode).inputNodes.remove(Integer.valueOf(inputTo));
|
||||||
|
assert removed;
|
||||||
|
}
|
||||||
|
//System.out.println(" increase output node: " + dest.outputNode + " vs " + outputEndNode);
|
||||||
|
outputNodes.get(outputEndNode).inputNodes.add(inputTo);
|
||||||
|
dest.outputNode = outputEndNode;
|
||||||
|
|
||||||
|
// Since all we ever do is merge incoming nodes together, and then renumber
|
||||||
|
// the merged nodes sequentially, we should only ever assign smaller node
|
||||||
|
// numbers:
|
||||||
|
assert outputEndNode <= inputTo: "outputEndNode=" + outputEndNode + " vs inputTo=" + inputTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputNode outDest = outputNodes.get(dest.outputNode);
|
||||||
|
// "shrink wrap" the offsets so the original tokens (with most
|
||||||
|
// restrictive offsets) win:
|
||||||
|
if (outDest.endOffset == -1 || endOffset < outDest.endOffset) {
|
||||||
|
outDest.endOffset = endOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//System.out.println(" got false from input");
|
||||||
|
input.end();
|
||||||
|
finalPosInc = posIncAtt.getPositionIncrement();
|
||||||
|
finalOffset = offsetAtt.endOffset();
|
||||||
|
done = true;
|
||||||
|
// Don't return false here: we need to force release any buffered tokens now
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only for debugging:
|
||||||
|
/*
|
||||||
|
private void printStates() {
|
||||||
|
System.out.println("states:");
|
||||||
|
for(int i=outputFrom;i<outputNodes.getMaxPos();i++) {
|
||||||
|
OutputNode outputNode = outputNodes.get(i);
|
||||||
|
System.out.println(" output " + i + ": inputs " + outputNode.inputNodes);
|
||||||
|
for(int inputNodeID : outputNode.inputNodes) {
|
||||||
|
InputNode inputNode = inputNodes.get(inputNodeID);
|
||||||
|
assert inputNode.outputNode == i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void end() throws IOException {
|
||||||
|
if (done == false) {
|
||||||
|
super.end();
|
||||||
|
} else {
|
||||||
|
// NOTE, shady: don't call super.end, because we did already from incrementToken
|
||||||
|
}
|
||||||
|
|
||||||
|
clearAttributes();
|
||||||
|
if (done) {
|
||||||
|
// On exc, done is false, and we will not have set these:
|
||||||
|
posIncAtt.setPositionIncrement(finalPosInc);
|
||||||
|
offsetAtt.setOffset(finalOffset, finalOffset);
|
||||||
|
} else {
|
||||||
|
super.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() throws IOException {
|
||||||
|
//System.out.println("F: reset");
|
||||||
|
super.reset();
|
||||||
|
inputFrom = -1;
|
||||||
|
inputNodes.reset();
|
||||||
|
InputNode in = inputNodes.get(0);
|
||||||
|
in.node = 0;
|
||||||
|
in.outputNode = 0;
|
||||||
|
|
||||||
|
outputNodes.reset();
|
||||||
|
OutputNode out = outputNodes.get(0);
|
||||||
|
out.node = 0;
|
||||||
|
out.inputNodes.add(0);
|
||||||
|
out.startOffset = 0;
|
||||||
|
outputFrom = 0;
|
||||||
|
//retOutputFrom = -1;
|
||||||
|
lastOutputFrom = -1;
|
||||||
|
done = false;
|
||||||
|
finalPosInc = -1;
|
||||||
|
finalOffset = -1;
|
||||||
|
lastStartOffset = 0;
|
||||||
|
maxLookaheadUsed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for testing
|
||||||
|
int getMaxLookaheadUsed() {
|
||||||
|
return maxLookaheadUsed;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.analysis.synonym;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
|
import org.apache.lucene.analysis.util.TokenFilterFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory for {@link FlattenGraphFilter}.
|
||||||
|
*
|
||||||
|
* @lucene.experimental
|
||||||
|
*/
|
||||||
|
public class FlattenGraphFilterFactory extends TokenFilterFactory {
|
||||||
|
|
||||||
|
/** Creates a new FlattenGraphFilterFactory */
|
||||||
|
public FlattenGraphFilterFactory(Map<String,String> args) {
|
||||||
|
super(args);
|
||||||
|
if (!args.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("Unknown parameters: " + args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TokenStream create(TokenStream input) {
|
||||||
|
return new FlattenGraphFilter(input);
|
||||||
|
}
|
||||||
|
}
|
|
@ -81,6 +81,9 @@ import org.apache.lucene.util.fst.FST;
|
||||||
* used for parsing. Subsequent tokens simply pass through
|
* used for parsing. Subsequent tokens simply pass through
|
||||||
* and are not parsed. A future improvement would be to
|
* and are not parsed. A future improvement would be to
|
||||||
* allow these tokens to also be matched.</p>
|
* allow these tokens to also be matched.</p>
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link SynonymGraphFilter} instead, but be sure to also
|
||||||
|
* use {@link FlattenGraphFilter} at index time (not at search time) as well.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO: maybe we should resolve token -> wordID then run
|
// TODO: maybe we should resolve token -> wordID then run
|
||||||
|
@ -105,6 +108,7 @@ import org.apache.lucene.util.fst.FST;
|
||||||
//
|
//
|
||||||
// Another possible solution is described at http://www.cis.uni-muenchen.de/people/Schulz/Pub/dictle5.ps
|
// Another possible solution is described at http://www.cis.uni-muenchen.de/people/Schulz/Pub/dictle5.ps
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public final class SynonymFilter extends TokenFilter {
|
public final class SynonymFilter extends TokenFilter {
|
||||||
|
|
||||||
public static final String TYPE_SYNONYM = "SYNONYM";
|
public static final String TYPE_SYNONYM = "SYNONYM";
|
||||||
|
|
|
@ -72,7 +72,11 @@ import org.apache.lucene.analysis.util.TokenizerFactory;
|
||||||
* <li><code>{@link Analyzer} analyzer</code> - an analyzer used for each raw synonym</li>
|
* <li><code>{@link Analyzer} analyzer</code> - an analyzer used for each raw synonym</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
* @see SolrSynonymParser SolrSynonymParser: default format
|
* @see SolrSynonymParser SolrSynonymParser: default format
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link SynonymGraphFilterFactory} instead, but be sure to also
|
||||||
|
* use {@link FlattenGraphFilterFactory} at index time (not at search time) as well.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class SynonymFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
|
public class SynonymFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
|
||||||
private final boolean ignoreCase;
|
private final boolean ignoreCase;
|
||||||
private final String tokenizerFactory;
|
private final String tokenizerFactory;
|
||||||
|
|
|
@ -0,0 +1,586 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.analysis.synonym;
|
||||||
|
|
||||||
|
import org.apache.lucene.analysis.TokenFilter;
|
||||||
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.PositionLengthAttribute;
|
||||||
|
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
|
||||||
|
import org.apache.lucene.store.ByteArrayDataInput;
|
||||||
|
import org.apache.lucene.util.AttributeSource;
|
||||||
|
import org.apache.lucene.util.BytesRef;
|
||||||
|
import org.apache.lucene.util.CharsRefBuilder;
|
||||||
|
import org.apache.lucene.util.RollingBuffer;
|
||||||
|
import org.apache.lucene.util.fst.FST;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
// TODO: maybe we should resolve token -> wordID then run
|
||||||
|
// FST on wordIDs, for better perf?
|
||||||
|
|
||||||
|
// TODO: a more efficient approach would be Aho/Corasick's
|
||||||
|
// algorithm
|
||||||
|
// http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm
|
||||||
|
// It improves over the current approach here
|
||||||
|
// because it does not fully re-start matching at every
|
||||||
|
// token. For example if one pattern is "a b c x"
|
||||||
|
// and another is "b c d" and the input is "a b c d", on
|
||||||
|
// trying to parse "a b c x" but failing when you got to x,
|
||||||
|
// rather than starting over again your really should
|
||||||
|
// immediately recognize that "b c d" matches at the next
|
||||||
|
// input. I suspect this won't matter that much in
|
||||||
|
// practice, but it's possible on some set of synonyms it
|
||||||
|
// will. We'd have to modify Aho/Corasick to enforce our
|
||||||
|
// conflict resolving (eg greedy matching) because that algo
|
||||||
|
// finds all matches. This really amounts to adding a .*
|
||||||
|
// closure to the FST and then determinizing it.
|
||||||
|
//
|
||||||
|
// Another possible solution is described at http://www.cis.uni-muenchen.de/people/Schulz/Pub/dictle5.ps
|
||||||
|
|
||||||
|
/** Applies single- or multi-token synonyms from a {@link SynonymMap}
|
||||||
|
* to an incoming {@link TokenStream}, producing a fully correct graph
|
||||||
|
* output. This is a replacement for {@link SynonymFilter}, which produces
|
||||||
|
* incorrect graphs for multi-token synonyms.
|
||||||
|
*
|
||||||
|
* <p>However, if you use this during indexing, you must follow it with
|
||||||
|
* {@link FlattenGraphFilter} to squash tokens on top of one another
|
||||||
|
* like {@link SynonymFilter}, because the indexer can't directly
|
||||||
|
* consume a graph. To get fully correct positional queries when your
|
||||||
|
* synonym replacements are multiple tokens, you should instead apply
|
||||||
|
* synonyms using this {@code TokenFilter} at query time and translate
|
||||||
|
* the resulting graph to a {@code TermAutomatonQuery} e.g. using
|
||||||
|
* {@code TokenStreamToTermAutomatonQuery}.
|
||||||
|
*
|
||||||
|
* <p><b>NOTE</b>: this cannot consume an incoming graph; results will
|
||||||
|
* be undefined.
|
||||||
|
*
|
||||||
|
* @lucene.experimental */
|
||||||
|
|
||||||
|
public final class SynonymGraphFilter extends TokenFilter {
|
||||||
|
|
||||||
|
public static final String TYPE_SYNONYM = "SYNONYM";
|
||||||
|
|
||||||
|
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
|
||||||
|
private final PositionIncrementAttribute posIncrAtt = addAttribute(PositionIncrementAttribute.class);
|
||||||
|
private final PositionLengthAttribute posLenAtt = addAttribute(PositionLengthAttribute.class);
|
||||||
|
private final TypeAttribute typeAtt = addAttribute(TypeAttribute.class);
|
||||||
|
private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
|
||||||
|
|
||||||
|
private final SynonymMap synonyms;
|
||||||
|
private final boolean ignoreCase;
|
||||||
|
|
||||||
|
private final FST<BytesRef> fst;
|
||||||
|
|
||||||
|
private final FST.BytesReader fstReader;
|
||||||
|
private final FST.Arc<BytesRef> scratchArc;
|
||||||
|
private final ByteArrayDataInput bytesReader = new ByteArrayDataInput();
|
||||||
|
private final BytesRef scratchBytes = new BytesRef();
|
||||||
|
private final CharsRefBuilder scratchChars = new CharsRefBuilder();
|
||||||
|
private final LinkedList<BufferedOutputToken> outputBuffer = new LinkedList<>();
|
||||||
|
|
||||||
|
private int nextNodeOut;
|
||||||
|
private int lastNodeOut;
|
||||||
|
private int maxLookaheadUsed;
|
||||||
|
|
||||||
|
// For testing:
|
||||||
|
private int captureCount;
|
||||||
|
|
||||||
|
private boolean liveToken;
|
||||||
|
|
||||||
|
// Start/end offset of the current match:
|
||||||
|
private int matchStartOffset;
|
||||||
|
private int matchEndOffset;
|
||||||
|
|
||||||
|
// True once the input TokenStream is exhausted:
|
||||||
|
private boolean finished;
|
||||||
|
|
||||||
|
private int lookaheadNextRead;
|
||||||
|
private int lookaheadNextWrite;
|
||||||
|
|
||||||
|
private RollingBuffer<BufferedInputToken> lookahead = new RollingBuffer<BufferedInputToken>() {
|
||||||
|
@Override
|
||||||
|
protected BufferedInputToken newInstance() {
|
||||||
|
return new BufferedInputToken();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static class BufferedInputToken implements RollingBuffer.Resettable {
|
||||||
|
final CharsRefBuilder term = new CharsRefBuilder();
|
||||||
|
AttributeSource.State state;
|
||||||
|
int startOffset = -1;
|
||||||
|
int endOffset = -1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
state = null;
|
||||||
|
term.clear();
|
||||||
|
|
||||||
|
// Intentionally invalid to ferret out bugs:
|
||||||
|
startOffset = -1;
|
||||||
|
endOffset = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class BufferedOutputToken {
|
||||||
|
final String term;
|
||||||
|
|
||||||
|
// Non-null if this was an incoming token:
|
||||||
|
final State state;
|
||||||
|
|
||||||
|
final int startNode;
|
||||||
|
final int endNode;
|
||||||
|
|
||||||
|
public BufferedOutputToken(State state, String term, int startNode, int endNode) {
|
||||||
|
this.state = state;
|
||||||
|
this.term = term;
|
||||||
|
this.startNode = startNode;
|
||||||
|
this.endNode = endNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public SynonymGraphFilter(TokenStream input, SynonymMap synonyms, boolean ignoreCase) {
|
||||||
|
super(input);
|
||||||
|
this.synonyms = synonyms;
|
||||||
|
this.fst = synonyms.fst;
|
||||||
|
if (fst == null) {
|
||||||
|
throw new IllegalArgumentException("fst must be non-null");
|
||||||
|
}
|
||||||
|
this.fstReader = fst.getBytesReader();
|
||||||
|
scratchArc = new FST.Arc<>();
|
||||||
|
this.ignoreCase = ignoreCase;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean incrementToken() throws IOException {
|
||||||
|
//System.out.println("\nS: incrToken lastNodeOut=" + lastNodeOut + " nextNodeOut=" + nextNodeOut);
|
||||||
|
|
||||||
|
assert lastNodeOut <= nextNodeOut;
|
||||||
|
|
||||||
|
if (outputBuffer.isEmpty() == false) {
|
||||||
|
// We still have pending outputs from a prior synonym match:
|
||||||
|
releaseBufferedToken();
|
||||||
|
//System.out.println(" syn: ret buffered=" + this);
|
||||||
|
assert liveToken == false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to parse a new synonym match at the current token:
|
||||||
|
|
||||||
|
if (parse()) {
|
||||||
|
// A new match was found:
|
||||||
|
releaseBufferedToken();
|
||||||
|
//System.out.println(" syn: after parse, ret buffered=" + this);
|
||||||
|
assert liveToken == false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lookaheadNextRead == lookaheadNextWrite) {
|
||||||
|
|
||||||
|
// Fast path: parse pulled one token, but it didn't match
|
||||||
|
// the start for any synonym, so we now return it "live" w/o having
|
||||||
|
// cloned all of its atts:
|
||||||
|
if (finished) {
|
||||||
|
//System.out.println(" syn: ret END");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert liveToken;
|
||||||
|
liveToken = false;
|
||||||
|
|
||||||
|
// NOTE: no need to change posInc since it's relative, i.e. whatever
|
||||||
|
// node our output is upto will just increase by the incoming posInc.
|
||||||
|
// We also don't need to change posLen, but only because we cannot
|
||||||
|
// consume a graph, so the incoming token can never span a future
|
||||||
|
// synonym match.
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// We still have buffered lookahead tokens from a previous
|
||||||
|
// parse attempt that required lookahead; just replay them now:
|
||||||
|
//System.out.println(" restore buffer");
|
||||||
|
assert lookaheadNextRead < lookaheadNextWrite: "read=" + lookaheadNextRead + " write=" + lookaheadNextWrite;
|
||||||
|
BufferedInputToken token = lookahead.get(lookaheadNextRead);
|
||||||
|
lookaheadNextRead++;
|
||||||
|
|
||||||
|
restoreState(token.state);
|
||||||
|
|
||||||
|
lookahead.freeBefore(lookaheadNextRead);
|
||||||
|
|
||||||
|
//System.out.println(" after restore offset=" + offsetAtt.startOffset() + "-" + offsetAtt.endOffset());
|
||||||
|
assert liveToken == false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastNodeOut += posIncrAtt.getPositionIncrement();
|
||||||
|
nextNodeOut = lastNodeOut + posLenAtt.getPositionLength();
|
||||||
|
|
||||||
|
//System.out.println(" syn: ret lookahead=" + this);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void releaseBufferedToken() throws IOException {
|
||||||
|
//System.out.println(" releaseBufferedToken");
|
||||||
|
|
||||||
|
BufferedOutputToken token = outputBuffer.pollFirst();
|
||||||
|
|
||||||
|
if (token.state != null) {
|
||||||
|
// This is an original input token (keepOrig=true case):
|
||||||
|
//System.out.println(" hasState");
|
||||||
|
restoreState(token.state);
|
||||||
|
//System.out.println(" startOffset=" + offsetAtt.startOffset() + " endOffset=" + offsetAtt.endOffset());
|
||||||
|
} else {
|
||||||
|
clearAttributes();
|
||||||
|
//System.out.println(" no state");
|
||||||
|
termAtt.append(token.term);
|
||||||
|
|
||||||
|
// We better have a match already:
|
||||||
|
assert matchStartOffset != -1;
|
||||||
|
|
||||||
|
offsetAtt.setOffset(matchStartOffset, matchEndOffset);
|
||||||
|
//System.out.println(" startOffset=" + matchStartOffset + " endOffset=" + matchEndOffset);
|
||||||
|
typeAtt.setType(TYPE_SYNONYM);
|
||||||
|
}
|
||||||
|
|
||||||
|
//System.out.println(" lastNodeOut=" + lastNodeOut);
|
||||||
|
//System.out.println(" term=" + termAtt);
|
||||||
|
|
||||||
|
posIncrAtt.setPositionIncrement(token.startNode - lastNodeOut);
|
||||||
|
lastNodeOut = token.startNode;
|
||||||
|
posLenAtt.setPositionLength(token.endNode - token.startNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Scans the next input token(s) to see if a synonym matches. Returns true
|
||||||
|
* if a match was found. */
|
||||||
|
private boolean parse() throws IOException {
|
||||||
|
// System.out.println(Thread.currentThread().getName() + ": S: parse: " + System.identityHashCode(this));
|
||||||
|
|
||||||
|
// Holds the longest match we've seen so far:
|
||||||
|
BytesRef matchOutput = null;
|
||||||
|
int matchInputLength = 0;
|
||||||
|
|
||||||
|
BytesRef pendingOutput = fst.outputs.getNoOutput();
|
||||||
|
fst.getFirstArc(scratchArc);
|
||||||
|
|
||||||
|
assert scratchArc.output == fst.outputs.getNoOutput();
|
||||||
|
|
||||||
|
// How many tokens in the current match
|
||||||
|
int matchLength = 0;
|
||||||
|
boolean doFinalCapture = false;
|
||||||
|
|
||||||
|
int lookaheadUpto = lookaheadNextRead;
|
||||||
|
matchStartOffset = -1;
|
||||||
|
|
||||||
|
byToken:
|
||||||
|
while (true) {
|
||||||
|
//System.out.println(" cycle lookaheadUpto=" + lookaheadUpto + " maxPos=" + lookahead.getMaxPos());
|
||||||
|
|
||||||
|
// Pull next token's chars:
|
||||||
|
final char[] buffer;
|
||||||
|
final int bufferLen;
|
||||||
|
final int inputEndOffset;
|
||||||
|
|
||||||
|
if (lookaheadUpto <= lookahead.getMaxPos()) {
|
||||||
|
// Still in our lookahead buffer
|
||||||
|
BufferedInputToken token = lookahead.get(lookaheadUpto);
|
||||||
|
lookaheadUpto++;
|
||||||
|
buffer = token.term.chars();
|
||||||
|
bufferLen = token.term.length();
|
||||||
|
inputEndOffset = token.endOffset;
|
||||||
|
//System.out.println(" use buffer now max=" + lookahead.getMaxPos());
|
||||||
|
if (matchStartOffset == -1) {
|
||||||
|
matchStartOffset = token.startOffset;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// We used up our lookahead buffer of input tokens
|
||||||
|
// -- pull next real input token:
|
||||||
|
|
||||||
|
assert finished || liveToken == false;
|
||||||
|
|
||||||
|
if (finished) {
|
||||||
|
//System.out.println(" break: finished");
|
||||||
|
break;
|
||||||
|
} else if (input.incrementToken()) {
|
||||||
|
//System.out.println(" input.incrToken");
|
||||||
|
liveToken = true;
|
||||||
|
buffer = termAtt.buffer();
|
||||||
|
bufferLen = termAtt.length();
|
||||||
|
if (matchStartOffset == -1) {
|
||||||
|
matchStartOffset = offsetAtt.startOffset();
|
||||||
|
}
|
||||||
|
inputEndOffset = offsetAtt.endOffset();
|
||||||
|
|
||||||
|
lookaheadUpto++;
|
||||||
|
} else {
|
||||||
|
// No more input tokens
|
||||||
|
finished = true;
|
||||||
|
//System.out.println(" break: now set finished");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
matchLength++;
|
||||||
|
//System.out.println(" cycle term=" + new String(buffer, 0, bufferLen));
|
||||||
|
|
||||||
|
// Run each char in this token through the FST:
|
||||||
|
int bufUpto = 0;
|
||||||
|
while (bufUpto < bufferLen) {
|
||||||
|
final int codePoint = Character.codePointAt(buffer, bufUpto, bufferLen);
|
||||||
|
if (fst.findTargetArc(ignoreCase ? Character.toLowerCase(codePoint) : codePoint, scratchArc, scratchArc, fstReader) == null) {
|
||||||
|
break byToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accum the output
|
||||||
|
pendingOutput = fst.outputs.add(pendingOutput, scratchArc.output);
|
||||||
|
bufUpto += Character.charCount(codePoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert bufUpto == bufferLen;
|
||||||
|
|
||||||
|
// OK, entire token matched; now see if this is a final
|
||||||
|
// state in the FST (a match):
|
||||||
|
if (scratchArc.isFinal()) {
|
||||||
|
matchOutput = fst.outputs.add(pendingOutput, scratchArc.nextFinalOutput);
|
||||||
|
matchInputLength = matchLength;
|
||||||
|
matchEndOffset = inputEndOffset;
|
||||||
|
//System.out.println(" ** match");
|
||||||
|
}
|
||||||
|
|
||||||
|
// See if the FST can continue matching (ie, needs to
|
||||||
|
// see the next input token):
|
||||||
|
if (fst.findTargetArc(SynonymMap.WORD_SEPARATOR, scratchArc, scratchArc, fstReader) == null) {
|
||||||
|
// No further rules can match here; we're done
|
||||||
|
// searching for matching rules starting at the
|
||||||
|
// current input position.
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// More matching is possible -- accum the output (if
|
||||||
|
// any) of the WORD_SEP arc:
|
||||||
|
pendingOutput = fst.outputs.add(pendingOutput, scratchArc.output);
|
||||||
|
doFinalCapture = true;
|
||||||
|
if (liveToken) {
|
||||||
|
capture();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doFinalCapture && liveToken && finished == false) {
|
||||||
|
// Must capture the final token if we captured any prior tokens:
|
||||||
|
capture();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchOutput != null) {
|
||||||
|
|
||||||
|
if (liveToken) {
|
||||||
|
// Single input token synonym; we must buffer it now:
|
||||||
|
capture();
|
||||||
|
}
|
||||||
|
|
||||||
|
// There is a match!
|
||||||
|
bufferOutputTokens(matchOutput, matchInputLength);
|
||||||
|
lookaheadNextRead += matchInputLength;
|
||||||
|
//System.out.println(" precmatch; set lookaheadNextRead=" + lookaheadNextRead + " now max=" + lookahead.getMaxPos());
|
||||||
|
lookahead.freeBefore(lookaheadNextRead);
|
||||||
|
//System.out.println(" match; set lookaheadNextRead=" + lookaheadNextRead + " now max=" + lookahead.getMaxPos());
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
//System.out.println(" no match; lookaheadNextRead=" + lookaheadNextRead);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//System.out.println(" parse done inputSkipCount=" + inputSkipCount + " nextRead=" + nextRead + " nextWrite=" + nextWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Expands the output graph into the necessary tokens, adding
|
||||||
|
* synonyms as side paths parallel to the input tokens, and
|
||||||
|
* buffers them in the output token buffer. */
|
||||||
|
private void bufferOutputTokens(BytesRef bytes, int matchInputLength) {
|
||||||
|
bytesReader.reset(bytes.bytes, bytes.offset, bytes.length);
|
||||||
|
|
||||||
|
final int code = bytesReader.readVInt();
|
||||||
|
final boolean keepOrig = (code & 0x1) == 0;
|
||||||
|
//System.out.println(" buffer: keepOrig=" + keepOrig + " matchInputLength=" + matchInputLength);
|
||||||
|
|
||||||
|
// How many nodes along all paths; we need this to assign the
|
||||||
|
// node ID for the final end node where all paths merge back:
|
||||||
|
int totalPathNodes;
|
||||||
|
if (keepOrig) {
|
||||||
|
assert matchInputLength > 0;
|
||||||
|
totalPathNodes = matchInputLength - 1;
|
||||||
|
} else {
|
||||||
|
totalPathNodes = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// How many synonyms we will insert over this match:
|
||||||
|
final int count = code >>> 1;
|
||||||
|
|
||||||
|
// TODO: we could encode this instead into the FST:
|
||||||
|
|
||||||
|
// 1st pass: count how many new nodes we need
|
||||||
|
List<List<String>> paths = new ArrayList<>();
|
||||||
|
for(int outputIDX=0;outputIDX<count;outputIDX++) {
|
||||||
|
int wordID = bytesReader.readVInt();
|
||||||
|
synonyms.words.get(wordID, scratchBytes);
|
||||||
|
scratchChars.copyUTF8Bytes(scratchBytes);
|
||||||
|
int lastStart = 0;
|
||||||
|
|
||||||
|
List<String> path = new ArrayList<>();
|
||||||
|
paths.add(path);
|
||||||
|
int chEnd = scratchChars.length();
|
||||||
|
for(int chUpto=0; chUpto<=chEnd; chUpto++) {
|
||||||
|
if (chUpto == chEnd || scratchChars.charAt(chUpto) == SynonymMap.WORD_SEPARATOR) {
|
||||||
|
path.add(new String(scratchChars.chars(), lastStart, chUpto - lastStart));
|
||||||
|
lastStart = 1 + chUpto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert path.size() > 0;
|
||||||
|
totalPathNodes += path.size() - 1;
|
||||||
|
}
|
||||||
|
//System.out.println(" totalPathNodes=" + totalPathNodes);
|
||||||
|
|
||||||
|
// 2nd pass: buffer tokens for the graph fragment
|
||||||
|
|
||||||
|
// NOTE: totalPathNodes will be 0 in the case where the matched
|
||||||
|
// input is a single token and all outputs are also a single token
|
||||||
|
|
||||||
|
// We "spawn" a side-path for each of the outputs for this matched
|
||||||
|
// synonym, all ending back at this end node:
|
||||||
|
|
||||||
|
int startNode = nextNodeOut;
|
||||||
|
|
||||||
|
int endNode = startNode + totalPathNodes + 1;
|
||||||
|
//System.out.println(" " + paths.size() + " new side-paths");
|
||||||
|
|
||||||
|
// First, fanout all tokens departing start node for these new side paths:
|
||||||
|
int newNodeCount = 0;
|
||||||
|
for(List<String> path : paths) {
|
||||||
|
int pathEndNode;
|
||||||
|
//System.out.println(" path size=" + path.size());
|
||||||
|
if (path.size() == 1) {
|
||||||
|
// Single token output, so there are no intermediate nodes:
|
||||||
|
pathEndNode = endNode;
|
||||||
|
} else {
|
||||||
|
pathEndNode = nextNodeOut + newNodeCount + 1;
|
||||||
|
newNodeCount += path.size() - 1;
|
||||||
|
}
|
||||||
|
outputBuffer.add(new BufferedOutputToken(null, path.get(0), startNode, pathEndNode));
|
||||||
|
}
|
||||||
|
|
||||||
|
// We must do the original tokens last, else the offsets "go backwards":
|
||||||
|
if (keepOrig) {
|
||||||
|
BufferedInputToken token = lookahead.get(lookaheadNextRead);
|
||||||
|
int inputEndNode;
|
||||||
|
if (matchInputLength == 1) {
|
||||||
|
// Single token matched input, so there are no intermediate nodes:
|
||||||
|
inputEndNode = endNode;
|
||||||
|
} else {
|
||||||
|
inputEndNode = nextNodeOut + newNodeCount + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//System.out.println(" keepOrig first token: " + token.term);
|
||||||
|
|
||||||
|
outputBuffer.add(new BufferedOutputToken(token.state, token.term.toString(), startNode, inputEndNode));
|
||||||
|
}
|
||||||
|
|
||||||
|
nextNodeOut = endNode;
|
||||||
|
|
||||||
|
// Do full side-path for each syn output:
|
||||||
|
for(int pathID=0;pathID<paths.size();pathID++) {
|
||||||
|
List<String> path = paths.get(pathID);
|
||||||
|
if (path.size() > 1) {
|
||||||
|
int lastNode = outputBuffer.get(pathID).endNode;
|
||||||
|
for(int i=1;i<path.size()-1;i++) {
|
||||||
|
outputBuffer.add(new BufferedOutputToken(null, path.get(i), lastNode, lastNode+1));
|
||||||
|
lastNode++;
|
||||||
|
}
|
||||||
|
outputBuffer.add(new BufferedOutputToken(null, path.get(path.size()-1), lastNode, endNode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keepOrig && matchInputLength > 1) {
|
||||||
|
// Do full "side path" with the original tokens:
|
||||||
|
int lastNode = outputBuffer.get(paths.size()).endNode;
|
||||||
|
for(int i=1;i<matchInputLength-1;i++) {
|
||||||
|
BufferedInputToken token = lookahead.get(lookaheadNextRead + i);
|
||||||
|
outputBuffer.add(new BufferedOutputToken(token.state, token.term.toString(), lastNode, lastNode+1));
|
||||||
|
lastNode++;
|
||||||
|
}
|
||||||
|
BufferedInputToken token = lookahead.get(lookaheadNextRead + matchInputLength - 1);
|
||||||
|
outputBuffer.add(new BufferedOutputToken(token.state, token.term.toString(), lastNode, endNode));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
System.out.println(" after buffer: " + outputBuffer.size() + " tokens:");
|
||||||
|
for(BufferedOutputToken token : outputBuffer) {
|
||||||
|
System.out.println(" tok: " + token.term + " startNode=" + token.startNode + " endNode=" + token.endNode);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Buffers the current input token into lookahead buffer. */
|
||||||
|
private void capture() {
|
||||||
|
assert liveToken;
|
||||||
|
liveToken = false;
|
||||||
|
BufferedInputToken token = lookahead.get(lookaheadNextWrite);
|
||||||
|
lookaheadNextWrite++;
|
||||||
|
|
||||||
|
token.state = captureState();
|
||||||
|
token.startOffset = offsetAtt.startOffset();
|
||||||
|
token.endOffset = offsetAtt.endOffset();
|
||||||
|
assert token.term.length() == 0;
|
||||||
|
token.term.append(termAtt);
|
||||||
|
|
||||||
|
captureCount++;
|
||||||
|
maxLookaheadUsed = Math.max(maxLookaheadUsed, lookahead.getBufferSize());
|
||||||
|
//System.out.println(" maxLookaheadUsed=" + maxLookaheadUsed);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() throws IOException {
|
||||||
|
super.reset();
|
||||||
|
lookahead.reset();
|
||||||
|
lookaheadNextWrite = 0;
|
||||||
|
lookaheadNextRead = 0;
|
||||||
|
captureCount = 0;
|
||||||
|
lastNodeOut = -1;
|
||||||
|
nextNodeOut = 0;
|
||||||
|
matchStartOffset = -1;
|
||||||
|
matchEndOffset = -1;
|
||||||
|
finished = false;
|
||||||
|
liveToken = false;
|
||||||
|
outputBuffer.clear();
|
||||||
|
maxLookaheadUsed = 0;
|
||||||
|
//System.out.println("S: reset");
|
||||||
|
}
|
||||||
|
|
||||||
|
// for testing
|
||||||
|
int getCaptureCount() {
|
||||||
|
return captureCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for testing
|
||||||
|
int getMaxLookaheadUsed() {
|
||||||
|
return maxLookaheadUsed;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.analysis.synonym;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.charset.CharsetDecoder;
|
||||||
|
import java.nio.charset.CodingErrorAction;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
|
import org.apache.lucene.analysis.Tokenizer;
|
||||||
|
import org.apache.lucene.analysis.core.LowerCaseFilter;
|
||||||
|
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
|
||||||
|
import org.apache.lucene.analysis.util.ResourceLoader;
|
||||||
|
import org.apache.lucene.analysis.util.ResourceLoaderAware;
|
||||||
|
import org.apache.lucene.analysis.util.TokenFilterFactory;
|
||||||
|
import org.apache.lucene.analysis.util.TokenizerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory for {@link SynonymGraphFilter}.
|
||||||
|
* <pre class="prettyprint">
|
||||||
|
* <fieldType name="text_synonym" class="solr.TextField" positionIncrementGap="100">
|
||||||
|
* <analyzer>
|
||||||
|
* <tokenizer class="solr.WhitespaceTokenizerFactory"/>
|
||||||
|
* <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt"
|
||||||
|
* format="solr" ignoreCase="false" expand="true"
|
||||||
|
* tokenizerFactory="solr.WhitespaceTokenizerFactory"
|
||||||
|
* [optional tokenizer factory parameters]/>
|
||||||
|
* </analyzer>
|
||||||
|
* </fieldType></pre>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* An optional param name prefix of "tokenizerFactory." may be used for any
|
||||||
|
* init params that the SynonymGraphFilterFactory needs to pass to the specified
|
||||||
|
* TokenizerFactory. If the TokenizerFactory expects an init parameters with
|
||||||
|
* the same name as an init param used by the SynonymGraphFilterFactory, the prefix
|
||||||
|
* is mandatory.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* The optional {@code format} parameter controls how the synonyms will be parsed:
|
||||||
|
* It supports the short names of {@code solr} for {@link SolrSynonymParser}
|
||||||
|
* and {@code wordnet} for and {@link WordnetSynonymParser}, or your own
|
||||||
|
* {@code SynonymMap.Parser} class name. The default is {@code solr}.
|
||||||
|
* A custom {@link SynonymMap.Parser} is expected to have a constructor taking:
|
||||||
|
* <ul>
|
||||||
|
* <li><code>boolean dedup</code> - true if duplicates should be ignored, false otherwise</li>
|
||||||
|
* <li><code>boolean expand</code> - true if conflation groups should be expanded, false if they are one-directional</li>
|
||||||
|
* <li><code>{@link Analyzer} analyzer</code> - an analyzer used for each raw synonym</li>
|
||||||
|
* </ul>
|
||||||
|
* @see SolrSynonymParser SolrSynonymParser: default format
|
||||||
|
*
|
||||||
|
* @lucene.experimental
|
||||||
|
*/
|
||||||
|
public class SynonymGraphFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
|
||||||
|
private final boolean ignoreCase;
|
||||||
|
private final String tokenizerFactory;
|
||||||
|
private final String synonyms;
|
||||||
|
private final String format;
|
||||||
|
private final boolean expand;
|
||||||
|
private final String analyzerName;
|
||||||
|
private final Map<String, String> tokArgs = new HashMap<>();
|
||||||
|
|
||||||
|
private SynonymMap map;
|
||||||
|
|
||||||
|
public SynonymGraphFilterFactory(Map<String,String> args) {
|
||||||
|
super(args);
|
||||||
|
ignoreCase = getBoolean(args, "ignoreCase", false);
|
||||||
|
synonyms = require(args, "synonyms");
|
||||||
|
format = get(args, "format");
|
||||||
|
expand = getBoolean(args, "expand", true);
|
||||||
|
|
||||||
|
analyzerName = get(args, "analyzer");
|
||||||
|
tokenizerFactory = get(args, "tokenizerFactory");
|
||||||
|
if (analyzerName != null && tokenizerFactory != null) {
|
||||||
|
throw new IllegalArgumentException("Analyzer and TokenizerFactory can't be specified both: " +
|
||||||
|
analyzerName + " and " + tokenizerFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tokenizerFactory != null) {
|
||||||
|
tokArgs.put("luceneMatchVersion", getLuceneMatchVersion().toString());
|
||||||
|
for (Iterator<String> itr = args.keySet().iterator(); itr.hasNext();) {
|
||||||
|
String key = itr.next();
|
||||||
|
tokArgs.put(key.replaceAll("^tokenizerFactory\\.",""), args.get(key));
|
||||||
|
itr.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!args.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("Unknown parameters: " + args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TokenStream create(TokenStream input) {
|
||||||
|
// if the fst is null, it means there's actually no synonyms... just return the original stream
|
||||||
|
// as there is nothing to do here.
|
||||||
|
return map.fst == null ? input : new SynonymGraphFilter(input, map, ignoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inform(ResourceLoader loader) throws IOException {
|
||||||
|
final TokenizerFactory factory = tokenizerFactory == null ? null : loadTokenizerFactory(loader, tokenizerFactory);
|
||||||
|
Analyzer analyzer;
|
||||||
|
|
||||||
|
if (analyzerName != null) {
|
||||||
|
analyzer = loadAnalyzer(loader, analyzerName);
|
||||||
|
} else {
|
||||||
|
analyzer = new Analyzer() {
|
||||||
|
@Override
|
||||||
|
protected TokenStreamComponents createComponents(String fieldName) {
|
||||||
|
Tokenizer tokenizer = factory == null ? new WhitespaceTokenizer() : factory.create();
|
||||||
|
TokenStream stream = ignoreCase ? new LowerCaseFilter(tokenizer) : tokenizer;
|
||||||
|
return new TokenStreamComponents(tokenizer, stream);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
try (Analyzer a = analyzer) {
|
||||||
|
String formatClass = format;
|
||||||
|
if (format == null || format.equals("solr")) {
|
||||||
|
formatClass = SolrSynonymParser.class.getName();
|
||||||
|
} else if (format.equals("wordnet")) {
|
||||||
|
formatClass = WordnetSynonymParser.class.getName();
|
||||||
|
}
|
||||||
|
// TODO: expose dedup as a parameter?
|
||||||
|
map = loadSynonyms(loader, formatClass, true, a);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
throw new IOException("Error parsing synonyms file:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load synonyms with the given {@link SynonymMap.Parser} class.
|
||||||
|
*/
|
||||||
|
protected SynonymMap loadSynonyms(ResourceLoader loader, String cname, boolean dedup, Analyzer analyzer) throws IOException, ParseException {
|
||||||
|
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder()
|
||||||
|
.onMalformedInput(CodingErrorAction.REPORT)
|
||||||
|
.onUnmappableCharacter(CodingErrorAction.REPORT);
|
||||||
|
|
||||||
|
SynonymMap.Parser parser;
|
||||||
|
Class<? extends SynonymMap.Parser> clazz = loader.findClass(cname, SynonymMap.Parser.class);
|
||||||
|
try {
|
||||||
|
parser = clazz.getConstructor(boolean.class, boolean.class, Analyzer.class).newInstance(dedup, expand, analyzer);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> files = splitFileNames(synonyms);
|
||||||
|
for (String file : files) {
|
||||||
|
decoder.reset();
|
||||||
|
parser.parse(new InputStreamReader(loader.openResource(file), decoder));
|
||||||
|
}
|
||||||
|
return parser.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// (there are no tests for this functionality)
|
||||||
|
private TokenizerFactory loadTokenizerFactory(ResourceLoader loader, String cname) throws IOException {
|
||||||
|
Class<? extends TokenizerFactory> clazz = loader.findClass(cname, TokenizerFactory.class);
|
||||||
|
try {
|
||||||
|
TokenizerFactory tokFactory = clazz.getConstructor(Map.class).newInstance(tokArgs);
|
||||||
|
if (tokFactory instanceof ResourceLoaderAware) {
|
||||||
|
((ResourceLoaderAware) tokFactory).inform(loader);
|
||||||
|
}
|
||||||
|
return tokFactory;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Analyzer loadAnalyzer(ResourceLoader loader, String cname) throws IOException {
|
||||||
|
Class<? extends Analyzer> clazz = loader.findClass(cname, Analyzer.class);
|
||||||
|
try {
|
||||||
|
Analyzer analyzer = clazz.getConstructor().newInstance();
|
||||||
|
if (analyzer instanceof ResourceLoaderAware) {
|
||||||
|
((ResourceLoaderAware) analyzer).inform(loader);
|
||||||
|
}
|
||||||
|
return analyzer;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -74,6 +74,11 @@ public class SynonymMap {
|
||||||
private int maxHorizontalContext;
|
private int maxHorizontalContext;
|
||||||
private final boolean dedup;
|
private final boolean dedup;
|
||||||
|
|
||||||
|
/** Default constructor, passes {@code dedup=true}. */
|
||||||
|
public Builder() {
|
||||||
|
this(true);
|
||||||
|
}
|
||||||
|
|
||||||
/** If dedup is true then identical rules (same input,
|
/** If dedup is true then identical rules (same input,
|
||||||
* same output) will be added only once. */
|
* same output) will be added only once. */
|
||||||
public Builder(boolean dedup) {
|
public Builder(boolean dedup) {
|
||||||
|
@ -109,8 +114,6 @@ public class SynonymMap {
|
||||||
reuse.setLength(upto);
|
reuse.setLength(upto);
|
||||||
return reuse.get();
|
return reuse.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** only used for asserting! */
|
/** only used for asserting! */
|
||||||
private boolean hasHoles(CharsRef chars) {
|
private boolean hasHoles(CharsRef chars) {
|
||||||
|
|
|
@ -256,10 +256,12 @@ public abstract class CharTokenizer extends Tokenizer {
|
||||||
}
|
}
|
||||||
end += charCount;
|
end += charCount;
|
||||||
length += Character.toChars(normalize(c), buffer, length); // buffer it, normalized
|
length += Character.toChars(normalize(c), buffer, length); // buffer it, normalized
|
||||||
if (length >= MAX_WORD_LEN) // buffer overflow! make sure to check for >= surrogate pair could break == test
|
if (length >= MAX_WORD_LEN) { // buffer overflow! make sure to check for >= surrogate pair could break == test
|
||||||
break;
|
break;
|
||||||
} else if (length > 0) // at non-Letter w/ chars
|
}
|
||||||
|
} else if (length > 0) { // at non-Letter w/ chars
|
||||||
break; // return 'em
|
break; // return 'em
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
termAtt.setLength(length);
|
termAtt.setLength(length);
|
||||||
|
|
|
@ -101,5 +101,7 @@ org.apache.lucene.analysis.standard.ClassicFilterFactory
|
||||||
org.apache.lucene.analysis.standard.StandardFilterFactory
|
org.apache.lucene.analysis.standard.StandardFilterFactory
|
||||||
org.apache.lucene.analysis.sv.SwedishLightStemFilterFactory
|
org.apache.lucene.analysis.sv.SwedishLightStemFilterFactory
|
||||||
org.apache.lucene.analysis.synonym.SynonymFilterFactory
|
org.apache.lucene.analysis.synonym.SynonymFilterFactory
|
||||||
|
org.apache.lucene.analysis.synonym.SynonymGraphFilterFactory
|
||||||
|
org.apache.lucene.analysis.synonym.FlattenGraphFilterFactory
|
||||||
org.apache.lucene.analysis.tr.TurkishLowerCaseFilterFactory
|
org.apache.lucene.analysis.tr.TurkishLowerCaseFilterFactory
|
||||||
org.apache.lucene.analysis.util.ElisionFilterFactory
|
org.apache.lucene.analysis.util.ElisionFilterFactory
|
||||||
|
|
|
@ -45,6 +45,8 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.apache.lucene.analysis.Analyzer;
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
|
@ -106,15 +108,7 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
static List<Constructor<? extends TokenFilter>> tokenfilters;
|
static List<Constructor<? extends TokenFilter>> tokenfilters;
|
||||||
static List<Constructor<? extends CharFilter>> charfilters;
|
static List<Constructor<? extends CharFilter>> charfilters;
|
||||||
|
|
||||||
private static interface Predicate<T> {
|
private static final Predicate<Object[]> ALWAYS = (objects -> true);
|
||||||
boolean apply(T o);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Predicate<Object[]> ALWAYS = new Predicate<Object[]>() {
|
|
||||||
public boolean apply(Object[] args) {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final Map<Constructor<?>,Predicate<Object[]>> brokenConstructors = new HashMap<>();
|
private static final Map<Constructor<?>,Predicate<Object[]>> brokenConstructors = new HashMap<>();
|
||||||
static {
|
static {
|
||||||
|
@ -124,36 +118,27 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
ALWAYS);
|
ALWAYS);
|
||||||
brokenConstructors.put(
|
brokenConstructors.put(
|
||||||
LimitTokenCountFilter.class.getConstructor(TokenStream.class, int.class, boolean.class),
|
LimitTokenCountFilter.class.getConstructor(TokenStream.class, int.class, boolean.class),
|
||||||
new Predicate<Object[]>() {
|
args -> {
|
||||||
@Override
|
|
||||||
public boolean apply(Object[] args) {
|
|
||||||
assert args.length == 3;
|
assert args.length == 3;
|
||||||
return !((Boolean) args[2]); // args are broken if consumeAllTokens is false
|
return !((Boolean) args[2]); // args are broken if consumeAllTokens is false
|
||||||
}
|
|
||||||
});
|
});
|
||||||
brokenConstructors.put(
|
brokenConstructors.put(
|
||||||
LimitTokenOffsetFilter.class.getConstructor(TokenStream.class, int.class),
|
LimitTokenOffsetFilter.class.getConstructor(TokenStream.class, int.class),
|
||||||
ALWAYS);
|
ALWAYS);
|
||||||
brokenConstructors.put(
|
brokenConstructors.put(
|
||||||
LimitTokenOffsetFilter.class.getConstructor(TokenStream.class, int.class, boolean.class),
|
LimitTokenOffsetFilter.class.getConstructor(TokenStream.class, int.class, boolean.class),
|
||||||
new Predicate<Object[]>() {
|
args -> {
|
||||||
@Override
|
|
||||||
public boolean apply(Object[] args) {
|
|
||||||
assert args.length == 3;
|
assert args.length == 3;
|
||||||
return !((Boolean) args[2]); // args are broken if consumeAllTokens is false
|
return !((Boolean) args[2]); // args are broken if consumeAllTokens is false
|
||||||
}
|
|
||||||
});
|
});
|
||||||
brokenConstructors.put(
|
brokenConstructors.put(
|
||||||
LimitTokenPositionFilter.class.getConstructor(TokenStream.class, int.class),
|
LimitTokenPositionFilter.class.getConstructor(TokenStream.class, int.class),
|
||||||
ALWAYS);
|
ALWAYS);
|
||||||
brokenConstructors.put(
|
brokenConstructors.put(
|
||||||
LimitTokenPositionFilter.class.getConstructor(TokenStream.class, int.class, boolean.class),
|
LimitTokenPositionFilter.class.getConstructor(TokenStream.class, int.class, boolean.class),
|
||||||
new Predicate<Object[]>() {
|
args -> {
|
||||||
@Override
|
|
||||||
public boolean apply(Object[] args) {
|
|
||||||
assert args.length == 3;
|
assert args.length == 3;
|
||||||
return !((Boolean) args[2]); // args are broken if consumeAllTokens is false
|
return !((Boolean) args[2]); // args are broken if consumeAllTokens is false
|
||||||
}
|
|
||||||
});
|
});
|
||||||
for (Class<?> c : Arrays.<Class<?>>asList(
|
for (Class<?> c : Arrays.<Class<?>>asList(
|
||||||
// TODO: can we promote some of these to be only
|
// TODO: can we promote some of these to be only
|
||||||
|
@ -247,12 +232,7 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final Comparator<Constructor<?>> ctorComp = new Comparator<Constructor<?>>() {
|
final Comparator<Constructor<?>> ctorComp = (arg0, arg1) -> arg0.toGenericString().compareTo(arg1.toGenericString());
|
||||||
@Override
|
|
||||||
public int compare(Constructor<?> arg0, Constructor<?> arg1) {
|
|
||||||
return arg0.toGenericString().compareTo(arg1.toGenericString());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Collections.sort(tokenizers, ctorComp);
|
Collections.sort(tokenizers, ctorComp);
|
||||||
Collections.sort(tokenfilters, ctorComp);
|
Collections.sort(tokenfilters, ctorComp);
|
||||||
Collections.sort(charfilters, ctorComp);
|
Collections.sort(charfilters, ctorComp);
|
||||||
|
@ -318,21 +298,14 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static interface ArgProducer {
|
private static final Map<Class<?>,Function<Random,Object>> argProducers = new IdentityHashMap<Class<?>,Function<Random,Object>>() {{
|
||||||
Object create(Random random);
|
put(int.class, random -> {
|
||||||
}
|
|
||||||
|
|
||||||
private static final Map<Class<?>,ArgProducer> argProducers = new IdentityHashMap<Class<?>,ArgProducer>() {{
|
|
||||||
put(int.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// TODO: could cause huge ram usage to use full int range for some filters
|
// TODO: could cause huge ram usage to use full int range for some filters
|
||||||
// (e.g. allocate enormous arrays)
|
// (e.g. allocate enormous arrays)
|
||||||
// return Integer.valueOf(random.nextInt());
|
// return Integer.valueOf(random.nextInt());
|
||||||
return Integer.valueOf(TestUtil.nextInt(random, -50, 50));
|
return Integer.valueOf(TestUtil.nextInt(random, -50, 50));
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(char.class, new ArgProducer() {
|
put(char.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// TODO: fix any filters that care to throw IAE instead.
|
// TODO: fix any filters that care to throw IAE instead.
|
||||||
// also add a unicode validating filter to validate termAtt?
|
// also add a unicode validating filter to validate termAtt?
|
||||||
// return Character.valueOf((char)random.nextInt(65536));
|
// return Character.valueOf((char)random.nextInt(65536));
|
||||||
|
@ -342,49 +315,19 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
return Character.valueOf(c);
|
return Character.valueOf(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(float.class, new ArgProducer() {
|
put(float.class, Random::nextFloat);
|
||||||
@Override public Object create(Random random) {
|
put(boolean.class, Random::nextBoolean);
|
||||||
return Float.valueOf(random.nextFloat());
|
put(byte.class, random -> (byte) random.nextInt(256));
|
||||||
}
|
put(byte[].class, random -> {
|
||||||
});
|
|
||||||
put(boolean.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
return Boolean.valueOf(random.nextBoolean());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
put(byte.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// this wraps to negative when casting to byte
|
|
||||||
return Byte.valueOf((byte) random.nextInt(256));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
put(byte[].class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
byte bytes[] = new byte[random.nextInt(256)];
|
byte bytes[] = new byte[random.nextInt(256)];
|
||||||
random.nextBytes(bytes);
|
random.nextBytes(bytes);
|
||||||
return bytes;
|
return bytes;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(Random.class, new ArgProducer() {
|
put(Random.class, random -> new Random(random.nextLong()));
|
||||||
@Override public Object create(Random random) {
|
put(Version.class, random -> Version.LATEST);
|
||||||
return new Random(random.nextLong());
|
put(AttributeFactory.class, BaseTokenStreamTestCase::newAttributeFactory);
|
||||||
}
|
put(Set.class,random -> {
|
||||||
});
|
|
||||||
put(Version.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// we expect bugs in emulating old versions
|
|
||||||
return Version.LATEST;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
put(AttributeFactory.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
return newAttributeFactory(random);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
put(Set.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// TypeTokenFilter
|
// TypeTokenFilter
|
||||||
Set<String> set = new HashSet<>();
|
Set<String> set = new HashSet<>();
|
||||||
int num = random.nextInt(5);
|
int num = random.nextInt(5);
|
||||||
|
@ -392,10 +335,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
set.add(StandardTokenizer.TOKEN_TYPES[random.nextInt(StandardTokenizer.TOKEN_TYPES.length)]);
|
set.add(StandardTokenizer.TOKEN_TYPES[random.nextInt(StandardTokenizer.TOKEN_TYPES.length)]);
|
||||||
}
|
}
|
||||||
return set;
|
return set;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(Collection.class, new ArgProducer() {
|
put(Collection.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// CapitalizationFilter
|
// CapitalizationFilter
|
||||||
Collection<char[]> col = new ArrayList<>();
|
Collection<char[]> col = new ArrayList<>();
|
||||||
int num = random.nextInt(5);
|
int num = random.nextInt(5);
|
||||||
|
@ -403,10 +344,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
col.add(TestUtil.randomSimpleString(random).toCharArray());
|
col.add(TestUtil.randomSimpleString(random).toCharArray());
|
||||||
}
|
}
|
||||||
return col;
|
return col;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(CharArraySet.class, new ArgProducer() {
|
put(CharArraySet.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
int num = random.nextInt(10);
|
int num = random.nextInt(10);
|
||||||
CharArraySet set = new CharArraySet(num, random.nextBoolean());
|
CharArraySet set = new CharArraySet(num, random.nextBoolean());
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
|
@ -414,28 +353,13 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
set.add(TestUtil.randomSimpleString(random));
|
set.add(TestUtil.randomSimpleString(random));
|
||||||
}
|
}
|
||||||
return set;
|
return set;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(Pattern.class, new ArgProducer() {
|
// TODO: don't want to make the exponentially slow ones Dawid documents
|
||||||
@Override public Object create(Random random) {
|
// in TestPatternReplaceFilter, so dont use truly random patterns (for now)
|
||||||
// TODO: don't want to make the exponentially slow ones Dawid documents
|
put(Pattern.class, random -> Pattern.compile("a"));
|
||||||
// in TestPatternReplaceFilter, so dont use truly random patterns (for now)
|
put(Pattern[].class, random -> new Pattern[] {Pattern.compile("([a-z]+)"), Pattern.compile("([0-9]+)")});
|
||||||
return Pattern.compile("a");
|
put(PayloadEncoder.class, random -> new IdentityEncoder()); // the other encoders will throw exceptions if tokens arent numbers?
|
||||||
}
|
put(Dictionary.class, random -> {
|
||||||
});
|
|
||||||
|
|
||||||
put(Pattern[].class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
return new Pattern[] {Pattern.compile("([a-z]+)"), Pattern.compile("([0-9]+)")};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
put(PayloadEncoder.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
return new IdentityEncoder(); // the other encoders will throw exceptions if tokens arent numbers?
|
|
||||||
}
|
|
||||||
});
|
|
||||||
put(Dictionary.class, new ArgProducer() {
|
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// TODO: make nastier
|
// TODO: make nastier
|
||||||
InputStream affixStream = TestHunspellStemFilter.class.getResourceAsStream("simple.aff");
|
InputStream affixStream = TestHunspellStemFilter.class.getResourceAsStream("simple.aff");
|
||||||
InputStream dictStream = TestHunspellStemFilter.class.getResourceAsStream("simple.dic");
|
InputStream dictStream = TestHunspellStemFilter.class.getResourceAsStream("simple.dic");
|
||||||
|
@ -445,10 +369,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
Rethrow.rethrow(ex);
|
Rethrow.rethrow(ex);
|
||||||
return null; // unreachable code
|
return null; // unreachable code
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(HyphenationTree.class, new ArgProducer() {
|
put(HyphenationTree.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// TODO: make nastier
|
// TODO: make nastier
|
||||||
try {
|
try {
|
||||||
InputSource is = new InputSource(TestCompoundWordTokenFilter.class.getResource("da_UTF8.xml").toExternalForm());
|
InputSource is = new InputSource(TestCompoundWordTokenFilter.class.getResource("da_UTF8.xml").toExternalForm());
|
||||||
|
@ -458,10 +380,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
Rethrow.rethrow(ex);
|
Rethrow.rethrow(ex);
|
||||||
return null; // unreachable code
|
return null; // unreachable code
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(SnowballProgram.class, new ArgProducer() {
|
put(SnowballProgram.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
try {
|
try {
|
||||||
String lang = TestSnowball.SNOWBALL_LANGS[random.nextInt(TestSnowball.SNOWBALL_LANGS.length)];
|
String lang = TestSnowball.SNOWBALL_LANGS[random.nextInt(TestSnowball.SNOWBALL_LANGS.length)];
|
||||||
Class<? extends SnowballProgram> clazz = Class.forName("org.tartarus.snowball.ext." + lang + "Stemmer").asSubclass(SnowballProgram.class);
|
Class<? extends SnowballProgram> clazz = Class.forName("org.tartarus.snowball.ext." + lang + "Stemmer").asSubclass(SnowballProgram.class);
|
||||||
|
@ -470,10 +390,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
Rethrow.rethrow(ex);
|
Rethrow.rethrow(ex);
|
||||||
return null; // unreachable code
|
return null; // unreachable code
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(String.class, new ArgProducer() {
|
put(String.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// TODO: make nastier
|
// TODO: make nastier
|
||||||
if (random.nextBoolean()) {
|
if (random.nextBoolean()) {
|
||||||
// a token type
|
// a token type
|
||||||
|
@ -481,10 +399,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
} else {
|
} else {
|
||||||
return TestUtil.randomSimpleString(random);
|
return TestUtil.randomSimpleString(random);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(NormalizeCharMap.class, new ArgProducer() {
|
put(NormalizeCharMap.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder();
|
NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder();
|
||||||
// we can't add duplicate keys, or NormalizeCharMap gets angry
|
// we can't add duplicate keys, or NormalizeCharMap gets angry
|
||||||
Set<String> keys = new HashSet<>();
|
Set<String> keys = new HashSet<>();
|
||||||
|
@ -500,10 +416,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(CharacterRunAutomaton.class, new ArgProducer() {
|
put(CharacterRunAutomaton.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
// TODO: could probably use a purely random automaton
|
// TODO: could probably use a purely random automaton
|
||||||
switch(random.nextInt(5)) {
|
switch(random.nextInt(5)) {
|
||||||
case 0: return MockTokenizer.KEYWORD;
|
case 0: return MockTokenizer.KEYWORD;
|
||||||
|
@ -512,10 +426,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
case 3: return MockTokenFilter.EMPTY_STOPSET;
|
case 3: return MockTokenFilter.EMPTY_STOPSET;
|
||||||
default: return MockTokenFilter.ENGLISH_STOPSET;
|
default: return MockTokenFilter.ENGLISH_STOPSET;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(CharArrayMap.class, new ArgProducer() {
|
put(CharArrayMap.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
int num = random.nextInt(10);
|
int num = random.nextInt(10);
|
||||||
CharArrayMap<String> map = new CharArrayMap<>(num, random.nextBoolean());
|
CharArrayMap<String> map = new CharArrayMap<>(num, random.nextBoolean());
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
|
@ -523,10 +435,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
map.put(TestUtil.randomSimpleString(random), TestUtil.randomSimpleString(random));
|
map.put(TestUtil.randomSimpleString(random), TestUtil.randomSimpleString(random));
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
put(StemmerOverrideMap.class, new ArgProducer() {
|
put(StemmerOverrideMap.class, random -> {
|
||||||
@Override public Object create(Random random) {
|
|
||||||
int num = random.nextInt(10);
|
int num = random.nextInt(10);
|
||||||
StemmerOverrideFilter.Builder builder = new StemmerOverrideFilter.Builder(random.nextBoolean());
|
StemmerOverrideFilter.Builder builder = new StemmerOverrideFilter.Builder(random.nextBoolean());
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
|
@ -545,11 +455,10 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Rethrow.rethrow(ex);
|
Rethrow.rethrow(ex);
|
||||||
return null; // unreachable code
|
return null; // unreachable code
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
put(SynonymMap.class, new ArgProducer() {
|
put(SynonymMap.class, new Function<Random, Object>() {
|
||||||
@Override public Object create(Random random) {
|
@Override public Object apply(Random random) {
|
||||||
SynonymMap.Builder b = new SynonymMap.Builder(random.nextBoolean());
|
SynonymMap.Builder b = new SynonymMap.Builder(random.nextBoolean());
|
||||||
final int numEntries = atLeast(10);
|
final int numEntries = atLeast(10);
|
||||||
for (int j = 0; j < numEntries; j++) {
|
for (int j = 0; j < numEntries; j++) {
|
||||||
|
@ -578,12 +487,9 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
put(DateFormat.class, new ArgProducer() {
|
put(DateFormat.class, random -> {
|
||||||
@Override
|
|
||||||
public Object create(Random random) {
|
|
||||||
if (random.nextBoolean()) return null;
|
if (random.nextBoolean()) return null;
|
||||||
return DateFormat.getDateInstance(DateFormat.DEFAULT, randomLocale(random));
|
return DateFormat.getDateInstance(DateFormat.DEFAULT, randomLocale(random));
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
@ -608,9 +514,9 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
static <T> T newRandomArg(Random random, Class<T> paramType) {
|
static <T> T newRandomArg(Random random, Class<T> paramType) {
|
||||||
final ArgProducer producer = argProducers.get(paramType);
|
final Function<Random,Object> producer = argProducers.get(paramType);
|
||||||
assertNotNull("No producer for arguments of type " + paramType.getName() + " found", producer);
|
assertNotNull("No producer for arguments of type " + paramType.getName() + " found", producer);
|
||||||
return (T) producer.create(random);
|
return (T) producer.apply(random);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object[] newTokenizerArgs(Random random, Class<?>[] paramTypes) {
|
static Object[] newTokenizerArgs(Random random, Class<?>[] paramTypes) {
|
||||||
|
@ -707,7 +613,8 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
sb.append("filters=");
|
sb.append("filters=");
|
||||||
sb.append(tokenFilterSpec.toString);
|
sb.append(tokenFilterSpec.toString);
|
||||||
sb.append("\n");
|
sb.append("\n");
|
||||||
sb.append("offsetsAreCorrect=" + tokenFilterSpec.offsetsAreCorrect);
|
sb.append("offsetsAreCorrect=");
|
||||||
|
sb.append(tokenFilterSpec.offsetsAreCorrect);
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -745,12 +652,12 @@ public class TestRandomChains extends BaseTokenStreamTestCase {
|
||||||
|
|
||||||
private boolean broken(Constructor<?> ctor, Object[] args) {
|
private boolean broken(Constructor<?> ctor, Object[] args) {
|
||||||
final Predicate<Object[]> pred = brokenConstructors.get(ctor);
|
final Predicate<Object[]> pred = brokenConstructors.get(ctor);
|
||||||
return pred != null && pred.apply(args);
|
return pred != null && pred.test(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean brokenOffsets(Constructor<?> ctor, Object[] args) {
|
private boolean brokenOffsets(Constructor<?> ctor, Object[] args) {
|
||||||
final Predicate<Object[]> pred = brokenOffsetsConstructors.get(ctor);
|
final Predicate<Object[]> pred = brokenOffsetsConstructors.get(ctor);
|
||||||
return pred != null && pred.apply(args);
|
return pred != null && pred.test(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a new random tokenizer from classpath
|
// create a new random tokenizer from classpath
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.apache.lucene.analysis.CharFilter;
|
||||||
import org.apache.lucene.analysis.TokenStream;
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
import org.apache.lucene.analysis.Tokenizer;
|
import org.apache.lucene.analysis.Tokenizer;
|
||||||
import org.apache.lucene.analysis.charfilter.HTMLStripCharFilterFactory;
|
import org.apache.lucene.analysis.charfilter.HTMLStripCharFilterFactory;
|
||||||
|
import org.apache.lucene.analysis.charfilter.MappingCharFilterFactory;
|
||||||
import org.apache.lucene.analysis.core.KeywordTokenizerFactory;
|
import org.apache.lucene.analysis.core.KeywordTokenizerFactory;
|
||||||
import org.apache.lucene.analysis.core.LowerCaseFilterFactory;
|
import org.apache.lucene.analysis.core.LowerCaseFilterFactory;
|
||||||
import org.apache.lucene.analysis.core.LowerCaseTokenizer;
|
import org.apache.lucene.analysis.core.LowerCaseTokenizer;
|
||||||
|
@ -479,4 +480,24 @@ public class TestCustomAnalyzer extends BaseTokenStreamTestCase {
|
||||||
assertEquals(new BytesRef("2A"), analyzer2.normalize("dummy", "0À"));
|
assertEquals(new BytesRef("2A"), analyzer2.normalize("dummy", "0À"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testNormalizationWithMultipleTokenFilters() throws IOException {
|
||||||
|
CustomAnalyzer analyzer = CustomAnalyzer.builder()
|
||||||
|
// none of these components are multi-term aware so they should not be applied
|
||||||
|
.withTokenizer(WhitespaceTokenizerFactory.class, Collections.emptyMap())
|
||||||
|
.addTokenFilter(LowerCaseFilterFactory.class, Collections.emptyMap())
|
||||||
|
.addTokenFilter(ASCIIFoldingFilterFactory.class, Collections.emptyMap())
|
||||||
|
.build();
|
||||||
|
assertEquals(new BytesRef("a b e"), analyzer.normalize("dummy", "À B é"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNormalizationWithMultiplCharFilters() throws IOException {
|
||||||
|
CustomAnalyzer analyzer = CustomAnalyzer.builder()
|
||||||
|
// none of these components are multi-term aware so they should not be applied
|
||||||
|
.withTokenizer(WhitespaceTokenizerFactory.class, Collections.emptyMap())
|
||||||
|
.addCharFilter(MappingCharFilterFactory.class, new HashMap<>(Collections.singletonMap("mapping", "org/apache/lucene/analysis/custom/mapping1.txt")))
|
||||||
|
.addCharFilter(MappingCharFilterFactory.class, new HashMap<>(Collections.singletonMap("mapping", "org/apache/lucene/analysis/custom/mapping2.txt")))
|
||||||
|
.build();
|
||||||
|
assertEquals(new BytesRef("e f c"), analyzer.normalize("dummy", "a b c"));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
"a" => "e"
|
|
@ -0,0 +1 @@
|
||||||
|
"b" => "f"
|
|
@ -224,18 +224,27 @@ public class TestWordDelimiterFilter extends BaseTokenStreamTestCase {
|
||||||
assertAnalyzesTo(a, "LUCENE / SOLR", new String[] { "LUCENE", "SOLR" },
|
assertAnalyzesTo(a, "LUCENE / SOLR", new String[] { "LUCENE", "SOLR" },
|
||||||
new int[] { 0, 9 },
|
new int[] { 0, 9 },
|
||||||
new int[] { 6, 13 },
|
new int[] { 6, 13 },
|
||||||
new int[] { 1, 1 });
|
null,
|
||||||
|
new int[] { 1, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
/* only in this case, posInc of 2 ?! */
|
/* only in this case, posInc of 2 ?! */
|
||||||
assertAnalyzesTo(a, "LUCENE / solR", new String[] { "LUCENE", "sol", "solR", "R" },
|
assertAnalyzesTo(a, "LUCENE / solR", new String[] { "LUCENE", "sol", "solR", "R" },
|
||||||
new int[] { 0, 9, 9, 12 },
|
new int[] { 0, 9, 9, 12 },
|
||||||
new int[] { 6, 12, 13, 13 },
|
new int[] { 6, 12, 13, 13 },
|
||||||
new int[] { 1, 1, 0, 1 });
|
null,
|
||||||
|
new int[] { 1, 1, 0, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
assertAnalyzesTo(a, "LUCENE / NUTCH SOLR", new String[] { "LUCENE", "NUTCH", "SOLR" },
|
assertAnalyzesTo(a, "LUCENE / NUTCH SOLR", new String[] { "LUCENE", "NUTCH", "SOLR" },
|
||||||
new int[] { 0, 9, 15 },
|
new int[] { 0, 9, 15 },
|
||||||
new int[] { 6, 14, 19 },
|
new int[] { 6, 14, 19 },
|
||||||
new int[] { 1, 1, 1 });
|
null,
|
||||||
|
new int[] { 1, 1, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
/* analyzer that will consume tokens with large position increments */
|
/* analyzer that will consume tokens with large position increments */
|
||||||
Analyzer a2 = new Analyzer() {
|
Analyzer a2 = new Analyzer() {
|
||||||
|
@ -252,24 +261,36 @@ public class TestWordDelimiterFilter extends BaseTokenStreamTestCase {
|
||||||
assertAnalyzesTo(a2, "LUCENE largegap SOLR", new String[] { "LUCENE", "largegap", "SOLR" },
|
assertAnalyzesTo(a2, "LUCENE largegap SOLR", new String[] { "LUCENE", "largegap", "SOLR" },
|
||||||
new int[] { 0, 7, 16 },
|
new int[] { 0, 7, 16 },
|
||||||
new int[] { 6, 15, 20 },
|
new int[] { 6, 15, 20 },
|
||||||
new int[] { 1, 10, 1 });
|
null,
|
||||||
|
new int[] { 1, 10, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
/* the "/" had a position increment of 10, where did it go?!?!! */
|
/* the "/" had a position increment of 10, where did it go?!?!! */
|
||||||
assertAnalyzesTo(a2, "LUCENE / SOLR", new String[] { "LUCENE", "SOLR" },
|
assertAnalyzesTo(a2, "LUCENE / SOLR", new String[] { "LUCENE", "SOLR" },
|
||||||
new int[] { 0, 9 },
|
new int[] { 0, 9 },
|
||||||
new int[] { 6, 13 },
|
new int[] { 6, 13 },
|
||||||
new int[] { 1, 11 });
|
null,
|
||||||
|
new int[] { 1, 11 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
/* in this case, the increment of 10 from the "/" is carried over */
|
/* in this case, the increment of 10 from the "/" is carried over */
|
||||||
assertAnalyzesTo(a2, "LUCENE / solR", new String[] { "LUCENE", "sol", "solR", "R" },
|
assertAnalyzesTo(a2, "LUCENE / solR", new String[] { "LUCENE", "sol", "solR", "R" },
|
||||||
new int[] { 0, 9, 9, 12 },
|
new int[] { 0, 9, 9, 12 },
|
||||||
new int[] { 6, 12, 13, 13 },
|
new int[] { 6, 12, 13, 13 },
|
||||||
new int[] { 1, 11, 0, 1 });
|
null,
|
||||||
|
new int[] { 1, 11, 0, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
assertAnalyzesTo(a2, "LUCENE / NUTCH SOLR", new String[] { "LUCENE", "NUTCH", "SOLR" },
|
assertAnalyzesTo(a2, "LUCENE / NUTCH SOLR", new String[] { "LUCENE", "NUTCH", "SOLR" },
|
||||||
new int[] { 0, 9, 15 },
|
new int[] { 0, 9, 15 },
|
||||||
new int[] { 6, 14, 19 },
|
new int[] { 6, 14, 19 },
|
||||||
new int[] { 1, 11, 1 });
|
null,
|
||||||
|
new int[] { 1, 11, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
Analyzer a3 = new Analyzer() {
|
Analyzer a3 = new Analyzer() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -284,14 +305,21 @@ public class TestWordDelimiterFilter extends BaseTokenStreamTestCase {
|
||||||
new String[] { "lucene", "lucenesolr", "solr" },
|
new String[] { "lucene", "lucenesolr", "solr" },
|
||||||
new int[] { 0, 0, 7 },
|
new int[] { 0, 0, 7 },
|
||||||
new int[] { 6, 11, 11 },
|
new int[] { 6, 11, 11 },
|
||||||
new int[] { 1, 0, 1 });
|
null,
|
||||||
|
new int[] { 1, 0, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
/* the stopword should add a gap here */
|
/* the stopword should add a gap here */
|
||||||
assertAnalyzesTo(a3, "the lucene.solr",
|
assertAnalyzesTo(a3, "the lucene.solr",
|
||||||
new String[] { "lucene", "lucenesolr", "solr" },
|
new String[] { "lucene", "lucenesolr", "solr" },
|
||||||
new int[] { 4, 4, 11 },
|
new int[] { 4, 4, 11 },
|
||||||
new int[] { 10, 15, 15 },
|
new int[] { 10, 15, 15 },
|
||||||
new int[] { 2, 0, 1 });
|
null,
|
||||||
|
new int[] { 2, 0, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
|
|
||||||
IOUtils.close(a, a2, a3);
|
IOUtils.close(a, a2, a3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +340,10 @@ public class TestWordDelimiterFilter extends BaseTokenStreamTestCase {
|
||||||
new String[] { "abc", "abcdef", "abcdef123456", "def", "123", "123456", "456" },
|
new String[] { "abc", "abcdef", "abcdef123456", "def", "123", "123456", "456" },
|
||||||
new int[] { 0, 0, 0, 4, 8, 8, 12 },
|
new int[] { 0, 0, 0, 4, 8, 8, 12 },
|
||||||
new int[] { 3, 7, 15, 7, 11, 15, 15 },
|
new int[] { 3, 7, 15, 7, 11, 15, 15 },
|
||||||
new int[] { 1, 0, 0, 1, 1, 0, 1 });
|
null,
|
||||||
|
new int[] { 1, 0, 0, 1, 1, 0, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
a.close();
|
a.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,7 +364,10 @@ public class TestWordDelimiterFilter extends BaseTokenStreamTestCase {
|
||||||
new String[] { "abc-def-123-456", "abc", "abcdef", "abcdef123456", "def", "123", "123456", "456" },
|
new String[] { "abc-def-123-456", "abc", "abcdef", "abcdef123456", "def", "123", "123456", "456" },
|
||||||
new int[] { 0, 0, 0, 0, 4, 8, 8, 12 },
|
new int[] { 0, 0, 0, 0, 4, 8, 8, 12 },
|
||||||
new int[] { 15, 3, 7, 15, 7, 11, 15, 15 },
|
new int[] { 15, 3, 7, 15, 7, 11, 15, 15 },
|
||||||
new int[] { 1, 0, 0, 0, 1, 1, 0, 1 });
|
null,
|
||||||
|
new int[] { 1, 0, 0, 0, 1, 1, 0, 1 },
|
||||||
|
null,
|
||||||
|
false);
|
||||||
a.close();
|
a.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,284 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.analysis.synonym;
|
||||||
|
|
||||||
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
|
import org.apache.lucene.analysis.BaseTokenStreamTestCase;
|
||||||
|
import org.apache.lucene.analysis.CannedTokenStream;
|
||||||
|
import org.apache.lucene.analysis.MockTokenizer;
|
||||||
|
import org.apache.lucene.analysis.Token;
|
||||||
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
|
import org.apache.lucene.analysis.Tokenizer;
|
||||||
|
|
||||||
|
public class TestFlattenGraphFilter extends BaseTokenStreamTestCase {
|
||||||
|
|
||||||
|
private static Token token(String term, int posInc, int posLength, int startOffset, int endOffset) {
|
||||||
|
final Token t = new Token(term, startOffset, endOffset);
|
||||||
|
t.setPositionIncrement(posInc);
|
||||||
|
t.setPositionLength(posLength);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSimpleMock() throws Exception {
|
||||||
|
Analyzer a = new Analyzer() {
|
||||||
|
@Override
|
||||||
|
protected TokenStreamComponents createComponents(String fieldName) {
|
||||||
|
Tokenizer tokenizer = new MockTokenizer(MockTokenizer.SIMPLE, true);
|
||||||
|
TokenStream ts = new FlattenGraphFilter(tokenizer);
|
||||||
|
return new TokenStreamComponents(tokenizer, ts);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
assertAnalyzesTo(a, "wtf happened",
|
||||||
|
new String[] {"wtf", "happened"},
|
||||||
|
new int[] { 0, 4},
|
||||||
|
new int[] { 3, 12},
|
||||||
|
null,
|
||||||
|
new int[] { 1, 1},
|
||||||
|
new int[] { 1, 1},
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure graph is unchanged if it's already flat
|
||||||
|
public void testAlreadyFlatten() throws Exception {
|
||||||
|
TokenStream in = new CannedTokenStream(0, 12, new Token[] {
|
||||||
|
token("wtf", 1, 1, 0, 3),
|
||||||
|
token("what", 0, 1, 0, 3),
|
||||||
|
token("wow", 0, 1, 0, 3),
|
||||||
|
token("the", 1, 1, 0, 3),
|
||||||
|
token("that's", 0, 1, 0, 3),
|
||||||
|
token("fudge", 1, 1, 0, 3),
|
||||||
|
token("funny", 0, 1, 0, 3),
|
||||||
|
token("happened", 1, 1, 4, 12)
|
||||||
|
});
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
// ... but on output, it's flattened to wtf/what/wow that's/the fudge/funny happened:
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"wtf", "what", "wow", "the", "that's", "fudge", "funny", "happened"},
|
||||||
|
new int[] {0, 0, 0, 0, 0, 0, 0, 4},
|
||||||
|
new int[] {3, 3, 3, 3, 3, 3, 3, 12},
|
||||||
|
new int[] {1, 0, 0, 1, 0, 1, 0, 1},
|
||||||
|
new int[] {1, 1, 1, 1, 1, 1, 1, 1},
|
||||||
|
12);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testWTF1() throws Exception {
|
||||||
|
|
||||||
|
// "wow that's funny" and "what the fudge" are separate side paths, in parallel with "wtf", on input:
|
||||||
|
TokenStream in = new CannedTokenStream(0, 12, new Token[] {
|
||||||
|
token("wtf", 1, 5, 0, 3),
|
||||||
|
token("what", 0, 1, 0, 3),
|
||||||
|
token("wow", 0, 3, 0, 3),
|
||||||
|
token("the", 1, 1, 0, 3),
|
||||||
|
token("fudge", 1, 3, 0, 3),
|
||||||
|
token("that's", 1, 1, 0, 3),
|
||||||
|
token("funny", 1, 1, 0, 3),
|
||||||
|
token("happened", 1, 1, 4, 12)
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
// ... but on output, it's flattened to wtf/what/wow that's/the fudge/funny happened:
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"wtf", "what", "wow", "the", "that's", "fudge", "funny", "happened"},
|
||||||
|
new int[] {0, 0, 0, 0, 0, 0, 0, 4},
|
||||||
|
new int[] {3, 3, 3, 3, 3, 3, 3, 12},
|
||||||
|
new int[] {1, 0, 0, 1, 0, 1, 0, 1},
|
||||||
|
new int[] {3, 1, 1, 1, 1, 1, 1, 1},
|
||||||
|
12);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Same as testWTF1 except the "wtf" token comes out later */
|
||||||
|
public void testWTF2() throws Exception {
|
||||||
|
|
||||||
|
// "wow that's funny" and "what the fudge" are separate side paths, in parallel with "wtf", on input:
|
||||||
|
TokenStream in = new CannedTokenStream(0, 12, new Token[] {
|
||||||
|
token("what", 1, 1, 0, 3),
|
||||||
|
token("wow", 0, 3, 0, 3),
|
||||||
|
token("wtf", 0, 5, 0, 3),
|
||||||
|
token("the", 1, 1, 0, 3),
|
||||||
|
token("fudge", 1, 3, 0, 3),
|
||||||
|
token("that's", 1, 1, 0, 3),
|
||||||
|
token("funny", 1, 1, 0, 3),
|
||||||
|
token("happened", 1, 1, 4, 12)
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
// ... but on output, it's flattened to wtf/what/wow that's/the fudge/funny happened:
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"what", "wow", "wtf", "the", "that's", "fudge", "funny", "happened"},
|
||||||
|
new int[] {0, 0, 0, 0, 0, 0, 0, 4},
|
||||||
|
new int[] {3, 3, 3, 3, 3, 3, 3, 12},
|
||||||
|
new int[] {1, 0, 0, 1, 0, 1, 0, 1},
|
||||||
|
new int[] {1, 1, 3, 1, 1, 1, 1, 1},
|
||||||
|
12);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNonGreedySynonyms() throws Exception {
|
||||||
|
// This is just "hypothetical" for Lucene today, because SynFilter is
|
||||||
|
// greedy: when two syn rules match on overlapping tokens, only one
|
||||||
|
// (greedily) wins. This test pretends all syn matches could match:
|
||||||
|
|
||||||
|
TokenStream in = new CannedTokenStream(0, 20, new Token[] {
|
||||||
|
token("wizard", 1, 1, 0, 6),
|
||||||
|
token("wizard_of_oz", 0, 3, 0, 12),
|
||||||
|
token("of", 1, 1, 7, 9),
|
||||||
|
token("oz", 1, 1, 10, 12),
|
||||||
|
token("oz_screams", 0, 2, 10, 20),
|
||||||
|
token("screams", 1, 1, 13, 20),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
// ... but on output, it's flattened to wtf/what/wow that's/the fudge/funny happened:
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"wizard", "wizard_of_oz", "of", "oz", "oz_screams", "screams"},
|
||||||
|
new int[] {0, 0, 7, 10, 10, 13},
|
||||||
|
new int[] {6, 12, 9, 12, 20, 20},
|
||||||
|
new int[] {1, 0, 1, 1, 0, 1},
|
||||||
|
new int[] {1, 3, 1, 1, 2, 1},
|
||||||
|
20);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNonGraph() throws Exception {
|
||||||
|
TokenStream in = new CannedTokenStream(0, 22, new Token[] {
|
||||||
|
token("hello", 1, 1, 0, 5),
|
||||||
|
token("pseudo", 1, 1, 6, 12),
|
||||||
|
token("world", 1, 1, 13, 18),
|
||||||
|
token("fun", 1, 1, 19, 22),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
// ... but on output, it's flattened to wtf/what/wow that's/the fudge/funny happened:
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"hello", "pseudo", "world", "fun"},
|
||||||
|
new int[] {0, 6, 13, 19},
|
||||||
|
new int[] {5, 12, 18, 22},
|
||||||
|
new int[] {1, 1, 1, 1},
|
||||||
|
new int[] {1, 1, 1, 1},
|
||||||
|
22);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSimpleHole() throws Exception {
|
||||||
|
TokenStream in = new CannedTokenStream(0, 13, new Token[] {
|
||||||
|
token("hello", 1, 1, 0, 5),
|
||||||
|
token("hole", 2, 1, 6, 10),
|
||||||
|
token("fun", 1, 1, 11, 13),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
// ... but on output, it's flattened to wtf/what/wow that's/the fudge/funny happened:
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"hello", "hole", "fun"},
|
||||||
|
new int[] {0, 6, 11},
|
||||||
|
new int[] {5, 10, 13},
|
||||||
|
new int[] {1, 2, 1},
|
||||||
|
new int[] {1, 1, 1},
|
||||||
|
13);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testHoleUnderSyn() throws Exception {
|
||||||
|
// Tests a StopFilter after SynFilter where a stopword in a syn is removed
|
||||||
|
//
|
||||||
|
// wizard of oz -> woz syn, but then "of" becomes a hole
|
||||||
|
|
||||||
|
TokenStream in = new CannedTokenStream(0, 12, new Token[] {
|
||||||
|
token("wizard", 1, 1, 0, 6),
|
||||||
|
token("woz", 0, 3, 0, 12),
|
||||||
|
token("oz", 2, 1, 10, 12),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"wizard", "woz", "oz"},
|
||||||
|
new int[] {0, 0, 10},
|
||||||
|
new int[] {6, 12, 12},
|
||||||
|
new int[] {1, 0, 2},
|
||||||
|
new int[] {1, 3, 1},
|
||||||
|
12);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStrangelyNumberedNodes() throws Exception {
|
||||||
|
|
||||||
|
// Uses only nodes 0, 2, 3, i.e. 1 is just never used (it is not a hole!!)
|
||||||
|
TokenStream in = new CannedTokenStream(0, 27, new Token[] {
|
||||||
|
token("dog", 1, 3, 0, 5),
|
||||||
|
token("puppy", 0, 3, 0, 5),
|
||||||
|
token("flies", 3, 1, 6, 11),
|
||||||
|
});
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"dog", "puppy", "flies"},
|
||||||
|
new int[] {0, 0, 6},
|
||||||
|
new int[] {5, 5, 11},
|
||||||
|
new int[] {1, 0, 1},
|
||||||
|
new int[] {1, 1, 1},
|
||||||
|
27);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testTwoLongParallelPaths() throws Exception {
|
||||||
|
|
||||||
|
// "a a a a a a" in parallel with "b b b b b b"
|
||||||
|
TokenStream in = new CannedTokenStream(0, 11, new Token[] {
|
||||||
|
token("a", 1, 1, 0, 1),
|
||||||
|
token("b", 0, 2, 0, 1),
|
||||||
|
token("a", 1, 2, 2, 3),
|
||||||
|
token("b", 1, 2, 2, 3),
|
||||||
|
token("a", 1, 2, 4, 5),
|
||||||
|
token("b", 1, 2, 4, 5),
|
||||||
|
token("a", 1, 2, 6, 7),
|
||||||
|
token("b", 1, 2, 6, 7),
|
||||||
|
token("a", 1, 2, 8, 9),
|
||||||
|
token("b", 1, 2, 8, 9),
|
||||||
|
token("a", 1, 2, 10, 11),
|
||||||
|
token("b", 1, 2, 10, 11),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TokenStream out = new FlattenGraphFilter(in);
|
||||||
|
|
||||||
|
// ... becomes flattened to a single path with overlapping a/b token between each node:
|
||||||
|
assertTokenStreamContents(out,
|
||||||
|
new String[] {"a", "b", "a", "b", "a", "b", "a", "b", "a", "b", "a", "b"},
|
||||||
|
new int[] {0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10},
|
||||||
|
new int[] {1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11},
|
||||||
|
new int[] {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
|
||||||
|
new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
|
||||||
|
11);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: TestSynonymGraphFilter's testRandomSyns also tests FlattenGraphFilter
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -46,9 +46,9 @@ public class PackedTokenAttributeImpl extends CharTermAttributeImpl
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setPositionIncrement(int positionIncrement) {
|
public void setPositionIncrement(int positionIncrement) {
|
||||||
if (positionIncrement < 0)
|
if (positionIncrement < 0) {
|
||||||
throw new IllegalArgumentException
|
throw new IllegalArgumentException("Increment must be zero or greater: " + positionIncrement);
|
||||||
("Increment must be zero or greater: " + positionIncrement);
|
}
|
||||||
this.positionIncrement = positionIncrement;
|
this.positionIncrement = positionIncrement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,6 +67,9 @@ public class PackedTokenAttributeImpl extends CharTermAttributeImpl
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setPositionLength(int positionLength) {
|
public void setPositionLength(int positionLength) {
|
||||||
|
if (positionLength < 1) {
|
||||||
|
throw new IllegalArgumentException("Position length must be 1 or greater: got " + positionLength);
|
||||||
|
}
|
||||||
this.positionLength = positionLength;
|
this.positionLength = positionLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ public abstract class DocValuesConsumer implements Closeable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIDMerger<NumericDocValuesSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<NumericDocValuesSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
|
|
||||||
final long finalCost = cost;
|
final long finalCost = cost;
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ public abstract class DocValuesConsumer implements Closeable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIDMerger<BinaryDocValuesSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<BinaryDocValuesSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
final long finalCost = cost;
|
final long finalCost = cost;
|
||||||
|
|
||||||
return new BinaryDocValues() {
|
return new BinaryDocValues() {
|
||||||
|
@ -397,7 +397,7 @@ public abstract class DocValuesConsumer implements Closeable {
|
||||||
|
|
||||||
final long finalCost = cost;
|
final long finalCost = cost;
|
||||||
|
|
||||||
final DocIDMerger<SortedNumericDocValuesSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<SortedNumericDocValuesSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
|
|
||||||
return new SortedNumericDocValues() {
|
return new SortedNumericDocValues() {
|
||||||
|
|
||||||
|
@ -555,7 +555,7 @@ public abstract class DocValuesConsumer implements Closeable {
|
||||||
|
|
||||||
final long finalCost = cost;
|
final long finalCost = cost;
|
||||||
|
|
||||||
final DocIDMerger<SortedDocValuesSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<SortedDocValuesSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
|
|
||||||
return new SortedDocValues() {
|
return new SortedDocValues() {
|
||||||
private int docID = -1;
|
private int docID = -1;
|
||||||
|
@ -721,7 +721,7 @@ public abstract class DocValuesConsumer implements Closeable {
|
||||||
subs.add(new SortedSetDocValuesSub(mergeState.docMaps[i], values, map.getGlobalOrds(i)));
|
subs.add(new SortedSetDocValuesSub(mergeState.docMaps[i], values, map.getGlobalOrds(i)));
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIDMerger<SortedSetDocValuesSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<SortedSetDocValuesSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
|
|
||||||
final long finalCost = cost;
|
final long finalCost = cost;
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ public abstract class NormsConsumer implements Closeable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIDMerger<NumericDocValuesSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<NumericDocValuesSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
|
|
||||||
return new NumericDocValues() {
|
return new NumericDocValues() {
|
||||||
private int docID = -1;
|
private int docID = -1;
|
||||||
|
|
|
@ -117,7 +117,7 @@ public abstract class StoredFieldsWriter implements Closeable {
|
||||||
subs.add(new StoredFieldsMergeSub(new MergeVisitor(mergeState, i), mergeState.docMaps[i], storedFieldsReader, mergeState.maxDocs[i]));
|
subs.add(new StoredFieldsMergeSub(new MergeVisitor(mergeState, i), mergeState.docMaps[i], storedFieldsReader, mergeState.maxDocs[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIDMerger<StoredFieldsMergeSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<StoredFieldsMergeSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
|
|
||||||
int docCount = 0;
|
int docCount = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
|
@ -205,7 +205,7 @@ public abstract class TermVectorsWriter implements Closeable {
|
||||||
subs.add(new TermVectorsMergeSub(mergeState.docMaps[i], reader, mergeState.maxDocs[i]));
|
subs.add(new TermVectorsMergeSub(mergeState.docMaps[i], reader, mergeState.maxDocs[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIDMerger<TermVectorsMergeSub> docIDMerger = new DocIDMerger<>(subs, mergeState.needsIndexSort);
|
final DocIDMerger<TermVectorsMergeSub> docIDMerger = DocIDMerger.of(subs, mergeState.needsIndexSort);
|
||||||
|
|
||||||
int docCount = 0;
|
int docCount = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
|
@ -514,7 +514,7 @@ public final class CompressingStoredFieldsWriter extends StoredFieldsWriter {
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIDMerger<CompressingStoredFieldsMergeSub> docIDMerger =
|
final DocIDMerger<CompressingStoredFieldsMergeSub> docIDMerger =
|
||||||
new DocIDMerger<>(subs, true);
|
DocIDMerger.of(subs, true);
|
||||||
while (true) {
|
while (true) {
|
||||||
CompressingStoredFieldsMergeSub sub = docIDMerger.next();
|
CompressingStoredFieldsMergeSub sub = docIDMerger.next();
|
||||||
if (sub == null) {
|
if (sub == null) {
|
||||||
|
|
|
@ -45,6 +45,32 @@ import org.apache.lucene.util.NumericUtils;
|
||||||
*/
|
*/
|
||||||
public final class DoublePoint extends Field {
|
public final class DoublePoint extends Field {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the least double that compares greater than {@code d} consistently
|
||||||
|
* with {@link Double#compare}. The only difference with
|
||||||
|
* {@link Math#nextUp(double)} is that this method returns {@code +0d} when
|
||||||
|
* the argument is {@code -0d}.
|
||||||
|
*/
|
||||||
|
public static double nextUp(double d) {
|
||||||
|
if (Double.doubleToLongBits(d) == 0x8000_0000_0000_0000L) { // -0d
|
||||||
|
return +0d;
|
||||||
|
}
|
||||||
|
return Math.nextUp(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the greatest double that compares less than {@code d} consistently
|
||||||
|
* with {@link Double#compare}. The only difference with
|
||||||
|
* {@link Math#nextDown(double)} is that this method returns {@code -0d} when
|
||||||
|
* the argument is {@code +0d}.
|
||||||
|
*/
|
||||||
|
public static double nextDown(double d) {
|
||||||
|
if (Double.doubleToLongBits(d) == 0L) { // +0d
|
||||||
|
return -0f;
|
||||||
|
}
|
||||||
|
return Math.nextDown(d);
|
||||||
|
}
|
||||||
|
|
||||||
private static FieldType getType(int numDims) {
|
private static FieldType getType(int numDims) {
|
||||||
FieldType type = new FieldType();
|
FieldType type = new FieldType();
|
||||||
type.setDimensions(numDims, Double.BYTES);
|
type.setDimensions(numDims, Double.BYTES);
|
||||||
|
@ -164,8 +190,8 @@ public final class DoublePoint extends Field {
|
||||||
* <p>
|
* <p>
|
||||||
* You can have half-open ranges (which are in fact </≤ or >/≥ queries)
|
* You can have half-open ranges (which are in fact </≤ or >/≥ queries)
|
||||||
* by setting {@code lowerValue = Double.NEGATIVE_INFINITY} or {@code upperValue = Double.POSITIVE_INFINITY}.
|
* by setting {@code lowerValue = Double.NEGATIVE_INFINITY} or {@code upperValue = Double.POSITIVE_INFINITY}.
|
||||||
* <p> Ranges are inclusive. For exclusive ranges, pass {@code Math#nextUp(lowerValue)}
|
* <p> Ranges are inclusive. For exclusive ranges, pass {@link #nextUp(double) nextUp(lowerValue)}
|
||||||
* or {@code Math.nextDown(upperValue)}.
|
* or {@link #nextUp(double) nextDown(upperValue)}.
|
||||||
* <p>
|
* <p>
|
||||||
* Range comparisons are consistent with {@link Double#compareTo(Double)}.
|
* Range comparisons are consistent with {@link Double#compareTo(Double)}.
|
||||||
*
|
*
|
||||||
|
|
|
@ -45,6 +45,32 @@ import org.apache.lucene.util.NumericUtils;
|
||||||
*/
|
*/
|
||||||
public final class FloatPoint extends Field {
|
public final class FloatPoint extends Field {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the least float that compares greater than {@code f} consistently
|
||||||
|
* with {@link Float#compare}. The only difference with
|
||||||
|
* {@link Math#nextUp(float)} is that this method returns {@code +0f} when
|
||||||
|
* the argument is {@code -0f}.
|
||||||
|
*/
|
||||||
|
public static float nextUp(float f) {
|
||||||
|
if (Float.floatToIntBits(f) == 0x8000_0000) { // -0f
|
||||||
|
return +0f;
|
||||||
|
}
|
||||||
|
return Math.nextUp(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the greatest float that compares less than {@code f} consistently
|
||||||
|
* with {@link Float#compare}. The only difference with
|
||||||
|
* {@link Math#nextDown(float)} is that this method returns {@code -0f} when
|
||||||
|
* the argument is {@code +0f}.
|
||||||
|
*/
|
||||||
|
public static float nextDown(float f) {
|
||||||
|
if (Float.floatToIntBits(f) == 0) { // +0f
|
||||||
|
return -0f;
|
||||||
|
}
|
||||||
|
return Math.nextDown(f);
|
||||||
|
}
|
||||||
|
|
||||||
private static FieldType getType(int numDims) {
|
private static FieldType getType(int numDims) {
|
||||||
FieldType type = new FieldType();
|
FieldType type = new FieldType();
|
||||||
type.setDimensions(numDims, Float.BYTES);
|
type.setDimensions(numDims, Float.BYTES);
|
||||||
|
@ -164,8 +190,8 @@ public final class FloatPoint extends Field {
|
||||||
* <p>
|
* <p>
|
||||||
* You can have half-open ranges (which are in fact </≤ or >/≥ queries)
|
* You can have half-open ranges (which are in fact </≤ or >/≥ queries)
|
||||||
* by setting {@code lowerValue = Float.NEGATIVE_INFINITY} or {@code upperValue = Float.POSITIVE_INFINITY}.
|
* by setting {@code lowerValue = Float.NEGATIVE_INFINITY} or {@code upperValue = Float.POSITIVE_INFINITY}.
|
||||||
* <p> Ranges are inclusive. For exclusive ranges, pass {@code Math#nextUp(lowerValue)}
|
* <p> Ranges are inclusive. For exclusive ranges, pass {@link #nextUp(float) nextUp(lowerValue)}
|
||||||
* or {@code Math.nextDown(upperValue)}.
|
* or {@link #nextUp(float) nextDown(upperValue)}.
|
||||||
* <p>
|
* <p>
|
||||||
* Range comparisons are consistent with {@link Float#compareTo(Float)}.
|
* Range comparisons are consistent with {@link Float#compareTo(Float)}.
|
||||||
*
|
*
|
||||||
|
|
|
@ -29,17 +29,7 @@ import static org.apache.lucene.search.DocIdSetIterator.NO_MORE_DOCS;
|
||||||
* concatenated (unsorted) order, or by a specified index-time sort, skipping
|
* concatenated (unsorted) order, or by a specified index-time sort, skipping
|
||||||
* deleted documents and remapping non-deleted documents. */
|
* deleted documents and remapping non-deleted documents. */
|
||||||
|
|
||||||
public class DocIDMerger<T extends DocIDMerger.Sub> {
|
public abstract class DocIDMerger<T extends DocIDMerger.Sub> {
|
||||||
|
|
||||||
private final List<T> subs;
|
|
||||||
|
|
||||||
// Used when indexSort != null:
|
|
||||||
private final PriorityQueue<T> queue;
|
|
||||||
private boolean first;
|
|
||||||
|
|
||||||
// Used when indexIsSorted
|
|
||||||
private T current;
|
|
||||||
private int nextIndex;
|
|
||||||
|
|
||||||
/** Represents one sub-reader being merged */
|
/** Represents one sub-reader being merged */
|
||||||
public static abstract class Sub {
|
public static abstract class Sub {
|
||||||
|
@ -58,104 +48,54 @@ public class DocIDMerger<T extends DocIDMerger.Sub> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Construct this from the provided subs, specifying the maximum sub count */
|
/** Construct this from the provided subs, specifying the maximum sub count */
|
||||||
public DocIDMerger(List<T> subs, int maxCount, boolean indexIsSorted) throws IOException {
|
public static <T extends DocIDMerger.Sub> DocIDMerger<T> of(List<T> subs, int maxCount, boolean indexIsSorted) throws IOException {
|
||||||
this.subs = subs;
|
|
||||||
|
|
||||||
if (indexIsSorted && maxCount > 1) {
|
if (indexIsSorted && maxCount > 1) {
|
||||||
queue = new PriorityQueue<T>(maxCount) {
|
return new SortedDocIDMerger<>(subs, maxCount);
|
||||||
@Override
|
|
||||||
protected boolean lessThan(Sub a, Sub b) {
|
|
||||||
assert a.mappedDocID != b.mappedDocID;
|
|
||||||
return a.mappedDocID < b.mappedDocID;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
// We simply concatentate
|
return new SequentialDocIDMerger<>(subs);
|
||||||
queue = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Construct this from the provided subs */
|
/** Construct this from the provided subs */
|
||||||
public DocIDMerger(List<T> subs, boolean indexIsSorted) throws IOException {
|
public static <T extends DocIDMerger.Sub> DocIDMerger<T> of(List<T> subs, boolean indexIsSorted) throws IOException {
|
||||||
this(subs, subs.size(), indexIsSorted);
|
return of(subs, subs.size(), indexIsSorted);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reuse API, currently only used by postings during merge */
|
/** Reuse API, currently only used by postings during merge */
|
||||||
public void reset() throws IOException {
|
public abstract void reset() throws IOException;
|
||||||
if (queue != null) {
|
|
||||||
// caller may not have fully consumed the queue:
|
|
||||||
queue.clear();
|
|
||||||
for(T sub : subs) {
|
|
||||||
while (true) {
|
|
||||||
int docID = sub.nextDoc();
|
|
||||||
if (docID == NO_MORE_DOCS) {
|
|
||||||
// all docs in this sub were deleted; do not add it to the queue!
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mappedDocID = sub.docMap.get(docID);
|
/** Returns null when done.
|
||||||
if (mappedDocID == -1) {
|
* <b>NOTE:</b> after the iterator has exhausted you should not call this
|
||||||
// doc was deleted
|
* method, as it may result in unpredicted behavior. */
|
||||||
continue;
|
public abstract T next() throws IOException;
|
||||||
} else {
|
|
||||||
sub.mappedDocID = mappedDocID;
|
private DocIDMerger() {}
|
||||||
queue.add(sub);
|
|
||||||
break;
|
private static class SequentialDocIDMerger<T extends DocIDMerger.Sub> extends DocIDMerger<T> {
|
||||||
}
|
|
||||||
}
|
private final List<T> subs;
|
||||||
}
|
private T current;
|
||||||
first = true;
|
private int nextIndex;
|
||||||
} else if (subs.size() > 0) {
|
|
||||||
current = subs.get(0);
|
private SequentialDocIDMerger(List<T> subs) throws IOException {
|
||||||
nextIndex = 1;
|
this.subs = subs;
|
||||||
} else {
|
reset();
|
||||||
current = null;
|
|
||||||
nextIndex = 0;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns null when done */
|
@Override
|
||||||
public T next() throws IOException {
|
public void reset() throws IOException {
|
||||||
// Loop until we find a non-deleted document
|
if (subs.size() > 0) {
|
||||||
if (queue != null) {
|
current = subs.get(0);
|
||||||
T top = queue.top();
|
nextIndex = 1;
|
||||||
if (top == null) {
|
} else {
|
||||||
// NOTE: it's annoying that caller is allowed to call us again even after we returned null before
|
current = null;
|
||||||
return null;
|
nextIndex = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (first == false) {
|
@Override
|
||||||
while (true) {
|
public T next() throws IOException {
|
||||||
int docID = top.nextDoc();
|
|
||||||
if (docID == NO_MORE_DOCS) {
|
|
||||||
queue.pop();
|
|
||||||
top = queue.top();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
int mappedDocID = top.docMap.get(docID);
|
|
||||||
if (mappedDocID == -1) {
|
|
||||||
// doc was deleted
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
top.mappedDocID = mappedDocID;
|
|
||||||
top = queue.updateTop();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
first = false;
|
|
||||||
|
|
||||||
return top;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (current == null) {
|
|
||||||
// NOTE: it's annoying that caller is allowed to call us again even after we returned null before
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
int docID = current.nextDoc();
|
int docID = current.nextDoc();
|
||||||
if (docID == NO_MORE_DOCS) {
|
if (docID == NO_MORE_DOCS) {
|
||||||
if (nextIndex == subs.size()) {
|
if (nextIndex == subs.size()) {
|
||||||
|
@ -166,15 +106,92 @@ public class DocIDMerger<T extends DocIDMerger.Sub> {
|
||||||
nextIndex++;
|
nextIndex++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int mappedDocID = current.docMap.get(docID);
|
|
||||||
if (mappedDocID == -1) {
|
|
||||||
// doc is deleted
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
current.mappedDocID = mappedDocID;
|
int mappedDocID = current.docMap.get(docID);
|
||||||
return current;
|
if (mappedDocID != -1) {
|
||||||
|
current.mappedDocID = mappedDocID;
|
||||||
|
return current;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class SortedDocIDMerger<T extends DocIDMerger.Sub> extends DocIDMerger<T> {
|
||||||
|
|
||||||
|
private final List<T> subs;
|
||||||
|
private final PriorityQueue<T> queue;
|
||||||
|
|
||||||
|
private SortedDocIDMerger(List<T> subs, int maxCount) throws IOException {
|
||||||
|
this.subs = subs;
|
||||||
|
queue = new PriorityQueue<T>(maxCount) {
|
||||||
|
@Override
|
||||||
|
protected boolean lessThan(Sub a, Sub b) {
|
||||||
|
assert a.mappedDocID != b.mappedDocID;
|
||||||
|
return a.mappedDocID < b.mappedDocID;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() throws IOException {
|
||||||
|
// caller may not have fully consumed the queue:
|
||||||
|
queue.clear();
|
||||||
|
boolean first = true;
|
||||||
|
for(T sub : subs) {
|
||||||
|
if (first) {
|
||||||
|
// by setting mappedDocID = -1, this entry is guaranteed to be the top of the queue
|
||||||
|
// so the first call to next() will advance it
|
||||||
|
sub.mappedDocID = -1;
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
int mappedDocID;
|
||||||
|
while (true) {
|
||||||
|
int docID = sub.nextDoc();
|
||||||
|
if (docID == NO_MORE_DOCS) {
|
||||||
|
mappedDocID = NO_MORE_DOCS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mappedDocID = sub.docMap.get(docID);
|
||||||
|
if (mappedDocID != -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mappedDocID == NO_MORE_DOCS) {
|
||||||
|
// all docs in this sub were deleted; do not add it to the queue!
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sub.mappedDocID = mappedDocID;
|
||||||
|
}
|
||||||
|
queue.add(sub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T next() throws IOException {
|
||||||
|
T top = queue.top();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
int docID = top.nextDoc();
|
||||||
|
if (docID == NO_MORE_DOCS) {
|
||||||
|
queue.pop();
|
||||||
|
top = queue.top();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
int mappedDocID = top.docMap.get(docID);
|
||||||
|
if (mappedDocID == -1) {
|
||||||
|
// doc was deleted
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
top.mappedDocID = mappedDocID;
|
||||||
|
top = queue.updateTop();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,10 +33,10 @@ import org.apache.lucene.store.Directory;
|
||||||
import org.apache.lucene.store.FlushInfo;
|
import org.apache.lucene.store.FlushInfo;
|
||||||
import org.apache.lucene.store.IOContext;
|
import org.apache.lucene.store.IOContext;
|
||||||
import org.apache.lucene.store.TrackingDirectoryWrapper;
|
import org.apache.lucene.store.TrackingDirectoryWrapper;
|
||||||
|
import org.apache.lucene.util.Bits;
|
||||||
import org.apache.lucene.util.ByteBlockPool.Allocator;
|
import org.apache.lucene.util.ByteBlockPool.Allocator;
|
||||||
import org.apache.lucene.util.ByteBlockPool.DirectTrackingAllocator;
|
import org.apache.lucene.util.ByteBlockPool.DirectTrackingAllocator;
|
||||||
import org.apache.lucene.util.Counter;
|
import org.apache.lucene.util.Counter;
|
||||||
import org.apache.lucene.util.FixedBitSet;
|
|
||||||
import org.apache.lucene.util.InfoStream;
|
import org.apache.lucene.util.InfoStream;
|
||||||
import org.apache.lucene.util.IntBlockPool;
|
import org.apache.lucene.util.IntBlockPool;
|
||||||
import org.apache.lucene.util.MutableBits;
|
import org.apache.lucene.util.MutableBits;
|
||||||
|
@ -496,15 +496,15 @@ class DocumentsWriterPerThread {
|
||||||
return filesToDelete;
|
return filesToDelete;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MutableBits sortLiveDocs(MutableBits bits, Sorter.DocMap sortMap) {
|
private MutableBits sortLiveDocs(Bits liveDocs, Sorter.DocMap sortMap) throws IOException {
|
||||||
assert bits != null && sortMap != null;
|
assert liveDocs != null && sortMap != null;
|
||||||
FixedBitSet bitSet = new FixedBitSet(bits.length());
|
MutableBits sortedLiveDocs = codec.liveDocsFormat().newLiveDocs(liveDocs.length());
|
||||||
for (int i = 0; i < bits.length(); i++) {
|
for (int i = 0; i < liveDocs.length(); i++) {
|
||||||
if (bits.get(i)) {
|
if (liveDocs.get(i) == false) {
|
||||||
bitSet.set(sortMap.oldToNew(i));
|
sortedLiveDocs.clear(sortMap.oldToNew(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bitSet;
|
return sortedLiveDocs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -62,7 +62,7 @@ final class MappingMultiPostingsEnum extends PostingsEnum {
|
||||||
for(int i=0;i<allSubs.length;i++) {
|
for(int i=0;i<allSubs.length;i++) {
|
||||||
allSubs[i] = new MappingPostingsSub(mergeState.docMaps[i]);
|
allSubs[i] = new MappingPostingsSub(mergeState.docMaps[i]);
|
||||||
}
|
}
|
||||||
this.docIDMerger = new DocIDMerger<MappingPostingsSub>(subs, allSubs.length, mergeState.needsIndexSort);
|
this.docIDMerger = DocIDMerger.of(subs, allSubs.length, mergeState.needsIndexSort);
|
||||||
}
|
}
|
||||||
|
|
||||||
MappingMultiPostingsEnum reset(MultiPostingsEnum postingsEnum) throws IOException {
|
MappingMultiPostingsEnum reset(MultiPostingsEnum postingsEnum) throws IOException {
|
||||||
|
|
|
@ -28,7 +28,7 @@ import org.apache.lucene.store.IndexInput;
|
||||||
import org.apache.lucene.store.IndexOutput;
|
import org.apache.lucene.store.IndexOutput;
|
||||||
|
|
||||||
final class TrackingTmpOutputDirectoryWrapper extends FilterDirectory {
|
final class TrackingTmpOutputDirectoryWrapper extends FilterDirectory {
|
||||||
private final Map<String, String> fileNames = new HashMap();
|
private final Map<String,String> fileNames = new HashMap<>();
|
||||||
|
|
||||||
TrackingTmpOutputDirectoryWrapper(Directory in) {
|
TrackingTmpOutputDirectoryWrapper(Directory in) {
|
||||||
super(in);
|
super(in);
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.search;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Per-segment, per-document double values, which can be calculated at search-time
|
||||||
|
*/
|
||||||
|
public abstract class DoubleValues {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the double value for the current document
|
||||||
|
*/
|
||||||
|
public abstract double doubleValue() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advance this instance to the given document id
|
||||||
|
* @return true if there is a value for this document
|
||||||
|
*/
|
||||||
|
public abstract boolean advanceExact(int doc) throws IOException;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,313 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.search;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.DoubleToLongFunction;
|
||||||
|
import java.util.function.LongToDoubleFunction;
|
||||||
|
|
||||||
|
import org.apache.lucene.index.DocValues;
|
||||||
|
import org.apache.lucene.index.LeafReaderContext;
|
||||||
|
import org.apache.lucene.index.NumericDocValues;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for producing {@link DoubleValues}
|
||||||
|
*
|
||||||
|
* To obtain a {@link DoubleValues} object for a leaf reader, clients should
|
||||||
|
* call {@link #getValues(LeafReaderContext, DoubleValues)}.
|
||||||
|
*
|
||||||
|
* DoubleValuesSource objects for NumericDocValues fields can be obtained by calling
|
||||||
|
* {@link #fromDoubleField(String)}, {@link #fromFloatField(String)}, {@link #fromIntField(String)}
|
||||||
|
* or {@link #fromLongField(String)}, or from {@link #fromField(String, LongToDoubleFunction)} if
|
||||||
|
* special long-to-double encoding is required.
|
||||||
|
*
|
||||||
|
* Scores may be used as a source for value calculations by wrapping a {@link Scorer} using
|
||||||
|
* {@link #fromScorer(Scorer)} and passing the resulting DoubleValues to {@link #getValues(LeafReaderContext, DoubleValues)}.
|
||||||
|
* The scores can then be accessed using the {@link #SCORES} DoubleValuesSource.
|
||||||
|
*/
|
||||||
|
public abstract class DoubleValuesSource {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@link DoubleValues} instance for the passed-in LeafReaderContext and scores
|
||||||
|
*
|
||||||
|
* If scores are not needed to calculate the values (ie {@link #needsScores() returns false}, callers
|
||||||
|
* may safely pass {@code null} for the {@code scores} parameter.
|
||||||
|
*/
|
||||||
|
public abstract DoubleValues getValues(LeafReaderContext ctx, DoubleValues scores) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if document scores are needed to calculate values
|
||||||
|
*/
|
||||||
|
public abstract boolean needsScores();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a sort field based on the value of this producer
|
||||||
|
* @param reverse true if the sort should be decreasing
|
||||||
|
*/
|
||||||
|
public SortField getSortField(boolean reverse) {
|
||||||
|
return new DoubleValuesSortField(this, reverse);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert to a LongValuesSource by casting the double values to longs
|
||||||
|
*/
|
||||||
|
public final LongValuesSource toLongValuesSource() {
|
||||||
|
return new LongValuesSource() {
|
||||||
|
@Override
|
||||||
|
public LongValues getValues(LeafReaderContext ctx, DoubleValues scores) throws IOException {
|
||||||
|
DoubleValues in = DoubleValuesSource.this.getValues(ctx, scores);
|
||||||
|
return new LongValues() {
|
||||||
|
@Override
|
||||||
|
public long longValue() throws IOException {
|
||||||
|
return (long) in.doubleValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean advanceExact(int doc) throws IOException {
|
||||||
|
return in.advanceExact(doc);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsScores() {
|
||||||
|
return DoubleValuesSource.this.needsScores();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a DoubleValuesSource that wraps a generic NumericDocValues field
|
||||||
|
*
|
||||||
|
* @param field the field to wrap, must have NumericDocValues
|
||||||
|
* @param decoder a function to convert the long-valued doc values to doubles
|
||||||
|
*/
|
||||||
|
public static DoubleValuesSource fromField(String field, LongToDoubleFunction decoder) {
|
||||||
|
return new FieldValuesSource(field, decoder);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a DoubleValuesSource that wraps a double-valued field
|
||||||
|
*/
|
||||||
|
public static DoubleValuesSource fromDoubleField(String field) {
|
||||||
|
return fromField(field, Double::longBitsToDouble);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a DoubleValuesSource that wraps a float-valued field
|
||||||
|
*/
|
||||||
|
public static DoubleValuesSource fromFloatField(String field) {
|
||||||
|
return fromField(field, (v) -> (double)Float.intBitsToFloat((int)v));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a DoubleValuesSource that wraps a long-valued field
|
||||||
|
*/
|
||||||
|
public static DoubleValuesSource fromLongField(String field) {
|
||||||
|
return fromField(field, (v) -> (double) v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a DoubleValuesSource that wraps an int-valued field
|
||||||
|
*/
|
||||||
|
public static DoubleValuesSource fromIntField(String field) {
|
||||||
|
return fromLongField(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A DoubleValuesSource that exposes a document's score
|
||||||
|
*
|
||||||
|
* If this source is used as part of a values calculation, then callers must not
|
||||||
|
* pass {@code null} as the {@link DoubleValues} parameter on {@link #getValues(LeafReaderContext, DoubleValues)}
|
||||||
|
*/
|
||||||
|
public static final DoubleValuesSource SCORES = new DoubleValuesSource() {
|
||||||
|
@Override
|
||||||
|
public DoubleValues getValues(LeafReaderContext ctx, DoubleValues scores) throws IOException {
|
||||||
|
assert scores != null;
|
||||||
|
return scores;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsScores() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a DoubleValues instance that wraps scores returned by a Scorer
|
||||||
|
*/
|
||||||
|
public static DoubleValues fromScorer(Scorer scorer) {
|
||||||
|
return new DoubleValues() {
|
||||||
|
@Override
|
||||||
|
public double doubleValue() throws IOException {
|
||||||
|
return scorer.score();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean advanceExact(int doc) throws IOException {
|
||||||
|
assert scorer.docID() == doc;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class FieldValuesSource extends DoubleValuesSource {
|
||||||
|
|
||||||
|
final String field;
|
||||||
|
final LongToDoubleFunction decoder;
|
||||||
|
|
||||||
|
private FieldValuesSource(String field, LongToDoubleFunction decoder) {
|
||||||
|
this.field = field;
|
||||||
|
this.decoder = decoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
FieldValuesSource that = (FieldValuesSource) o;
|
||||||
|
return Objects.equals(field, that.field) &&
|
||||||
|
Objects.equals(decoder, that.decoder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(field, decoder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DoubleValues getValues(LeafReaderContext ctx, DoubleValues scores) throws IOException {
|
||||||
|
final NumericDocValues values = DocValues.getNumeric(ctx.reader(), field);
|
||||||
|
return toDoubleValues(values, decoder::applyAsDouble);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsScores() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class DoubleValuesSortField extends SortField {
|
||||||
|
|
||||||
|
final DoubleValuesSource producer;
|
||||||
|
|
||||||
|
public DoubleValuesSortField(DoubleValuesSource producer, boolean reverse) {
|
||||||
|
super(producer.toString(), new DoubleValuesComparatorSource(producer), reverse);
|
||||||
|
this.producer = producer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsScores() {
|
||||||
|
return producer.needsScores();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder buffer = new StringBuilder("<");
|
||||||
|
buffer.append(getField()).append(">");
|
||||||
|
if (reverse)
|
||||||
|
buffer.append("!");
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class DoubleValuesHolder {
|
||||||
|
DoubleValues values;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class DoubleValuesComparatorSource extends FieldComparatorSource {
|
||||||
|
private final DoubleValuesSource producer;
|
||||||
|
|
||||||
|
public DoubleValuesComparatorSource(DoubleValuesSource producer) {
|
||||||
|
this.producer = producer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FieldComparator<Double> newComparator(String fieldname, int numHits,
|
||||||
|
int sortPos, boolean reversed) throws IOException {
|
||||||
|
return new FieldComparator.DoubleComparator(numHits, fieldname, 0.0){
|
||||||
|
|
||||||
|
LeafReaderContext ctx;
|
||||||
|
DoubleValuesHolder holder = new DoubleValuesHolder();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected NumericDocValues getNumericDocValues(LeafReaderContext context, String field) throws IOException {
|
||||||
|
ctx = context;
|
||||||
|
return asNumericDocValues(holder, Double::doubleToLongBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScorer(Scorer scorer) throws IOException {
|
||||||
|
holder.values = producer.getValues(ctx, fromScorer(scorer));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DoubleValues toDoubleValues(NumericDocValues in, LongToDoubleFunction map) {
|
||||||
|
return new DoubleValues() {
|
||||||
|
@Override
|
||||||
|
public double doubleValue() throws IOException {
|
||||||
|
return map.applyAsDouble(in.longValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean advanceExact(int target) throws IOException {
|
||||||
|
return in.advanceExact(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NumericDocValues asNumericDocValues(DoubleValuesHolder in, DoubleToLongFunction converter) {
|
||||||
|
return new NumericDocValues() {
|
||||||
|
@Override
|
||||||
|
public long longValue() throws IOException {
|
||||||
|
return converter.applyAsLong(in.values.doubleValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean advanceExact(int target) throws IOException {
|
||||||
|
return in.values.advanceExact(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int docID() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int nextDoc() throws IOException {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int advance(int target) throws IOException {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long cost() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.search;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.apache.lucene.index.IndexReader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A query that wraps multiple sub-queries generated from a graph token stream.
|
||||||
|
*/
|
||||||
|
public final class GraphQuery extends Query {
|
||||||
|
private final Query[] queries;
|
||||||
|
private boolean hasBoolean = false;
|
||||||
|
private boolean hasPhrase = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor sets the queries and checks if any of them are
|
||||||
|
* a boolean query.
|
||||||
|
*
|
||||||
|
* @param queries the non-null array of queries
|
||||||
|
*/
|
||||||
|
public GraphQuery(Query... queries) {
|
||||||
|
this.queries = Objects.requireNonNull(queries).clone();
|
||||||
|
for (Query query : queries) {
|
||||||
|
if (query instanceof BooleanQuery) {
|
||||||
|
hasBoolean = true;
|
||||||
|
} else if (query instanceof PhraseQuery) {
|
||||||
|
hasPhrase = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the queries
|
||||||
|
*
|
||||||
|
* @return unmodifiable list of Query
|
||||||
|
*/
|
||||||
|
public List<Query> getQueries() {
|
||||||
|
return Collections.unmodifiableList(Arrays.asList(queries));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there is at least one boolean query or not.
|
||||||
|
*
|
||||||
|
* @return true if there is a boolean, false if not
|
||||||
|
*/
|
||||||
|
public boolean hasBoolean() {
|
||||||
|
return hasBoolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there is at least one phrase query or not.
|
||||||
|
*
|
||||||
|
* @return true if there is a phrase query, false if not
|
||||||
|
*/
|
||||||
|
public boolean hasPhrase() {
|
||||||
|
return hasPhrase;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rewrites to a single query or a boolean query where each query is a SHOULD clause.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Query rewrite(IndexReader reader) throws IOException {
|
||||||
|
if (queries.length == 0) {
|
||||||
|
return new BooleanQuery.Builder().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queries.length == 1) {
|
||||||
|
return queries[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
BooleanQuery.Builder q = new BooleanQuery.Builder();
|
||||||
|
for (Query clause : queries) {
|
||||||
|
q.add(clause, BooleanClause.Occur.SHOULD);
|
||||||
|
}
|
||||||
|
|
||||||
|
return q.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(String field) {
|
||||||
|
StringBuilder builder = new StringBuilder("Graph(");
|
||||||
|
for (int i = 0; i < queries.length; i++) {
|
||||||
|
if (i != 0) {
|
||||||
|
builder.append(", ");
|
||||||
|
}
|
||||||
|
builder.append(Objects.toString(queries[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queries.length > 0) {
|
||||||
|
builder.append(", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append("hasBoolean=")
|
||||||
|
.append(hasBoolean)
|
||||||
|
.append(", hasPhrase=")
|
||||||
|
.append(hasPhrase)
|
||||||
|
.append(")");
|
||||||
|
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
return sameClassAs(other) &&
|
||||||
|
hasBoolean == ((GraphQuery) other).hasBoolean &&
|
||||||
|
hasPhrase == ((GraphQuery) other).hasPhrase &&
|
||||||
|
Arrays.equals(queries, ((GraphQuery) other).queries);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return 31 * classHash() + Arrays.deepHashCode(new Object[]{hasBoolean, hasPhrase, queries});
|
||||||
|
}
|
||||||
|
}
|
|
@ -114,6 +114,6 @@ public interface LeafFieldComparator {
|
||||||
*
|
*
|
||||||
* @param scorer Scorer instance that you should use to
|
* @param scorer Scorer instance that you should use to
|
||||||
* obtain the current hit's score, if necessary. */
|
* obtain the current hit's score, if necessary. */
|
||||||
void setScorer(Scorer scorer);
|
void setScorer(Scorer scorer) throws IOException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.search;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Per-segment, per-document long values, which can be calculated at search-time
|
||||||
|
*/
|
||||||
|
public abstract class LongValues {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the long value for the current document
|
||||||
|
*/
|
||||||
|
public abstract long longValue() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advance this instance to the given document id
|
||||||
|
* @return true if there is a value for this document
|
||||||
|
*/
|
||||||
|
public abstract boolean advanceExact(int doc) throws IOException;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,217 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.lucene.search;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.apache.lucene.index.DocValues;
|
||||||
|
import org.apache.lucene.index.LeafReaderContext;
|
||||||
|
import org.apache.lucene.index.NumericDocValues;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for producing {@link LongValues}
|
||||||
|
*
|
||||||
|
* To obtain a {@link LongValues} object for a leaf reader, clients should
|
||||||
|
* call {@link #getValues(LeafReaderContext, DoubleValues)}.
|
||||||
|
*
|
||||||
|
* LongValuesSource objects for long and int-valued NumericDocValues fields can
|
||||||
|
* be obtained by calling {@link #fromLongField(String)} and {@link #fromIntField(String)}.
|
||||||
|
*
|
||||||
|
* To obtain a LongValuesSource from a float or double-valued NumericDocValues field,
|
||||||
|
* use {@link DoubleValuesSource#fromFloatField(String)} or {@link DoubleValuesSource#fromDoubleField(String)}
|
||||||
|
* and then call {@link DoubleValuesSource#toLongValuesSource()}.
|
||||||
|
*/
|
||||||
|
public abstract class LongValuesSource {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@link LongValues} instance for the passed-in LeafReaderContext and scores
|
||||||
|
*
|
||||||
|
* If scores are not needed to calculate the values (ie {@link #needsScores() returns false}, callers
|
||||||
|
* may safely pass {@code null} for the {@code scores} parameter.
|
||||||
|
*/
|
||||||
|
public abstract LongValues getValues(LeafReaderContext ctx, DoubleValues scores) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if document scores are needed to calculate values
|
||||||
|
*/
|
||||||
|
public abstract boolean needsScores();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a sort field based on the value of this producer
|
||||||
|
* @param reverse true if the sort should be decreasing
|
||||||
|
*/
|
||||||
|
public SortField getSortField(boolean reverse) {
|
||||||
|
return new LongValuesSortField(this, reverse);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a LongValuesSource that wraps a long-valued field
|
||||||
|
*/
|
||||||
|
public static LongValuesSource fromLongField(String field) {
|
||||||
|
return new FieldValuesSource(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a LongValuesSource that wraps an int-valued field
|
||||||
|
*/
|
||||||
|
public static LongValuesSource fromIntField(String field) {
|
||||||
|
return fromLongField(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class FieldValuesSource extends LongValuesSource {
|
||||||
|
|
||||||
|
final String field;
|
||||||
|
|
||||||
|
private FieldValuesSource(String field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
FieldValuesSource that = (FieldValuesSource) o;
|
||||||
|
return Objects.equals(field, that.field);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LongValues getValues(LeafReaderContext ctx, DoubleValues scores) throws IOException {
|
||||||
|
final NumericDocValues values = DocValues.getNumeric(ctx.reader(), field);
|
||||||
|
return toLongValues(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsScores() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class LongValuesSortField extends SortField {
|
||||||
|
|
||||||
|
final LongValuesSource producer;
|
||||||
|
|
||||||
|
public LongValuesSortField(LongValuesSource producer, boolean reverse) {
|
||||||
|
super(producer.toString(), new LongValuesComparatorSource(producer), reverse);
|
||||||
|
this.producer = producer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsScores() {
|
||||||
|
return producer.needsScores();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder buffer = new StringBuilder("<");
|
||||||
|
buffer.append(getField()).append(">");
|
||||||
|
if (reverse)
|
||||||
|
buffer.append("!");
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class LongValuesHolder {
|
||||||
|
LongValues values;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class LongValuesComparatorSource extends FieldComparatorSource {
|
||||||
|
private final LongValuesSource producer;
|
||||||
|
|
||||||
|
public LongValuesComparatorSource(LongValuesSource producer) {
|
||||||
|
this.producer = producer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FieldComparator<Long> newComparator(String fieldname, int numHits,
|
||||||
|
int sortPos, boolean reversed) throws IOException {
|
||||||
|
return new FieldComparator.LongComparator(numHits, fieldname, 0L){
|
||||||
|
|
||||||
|
LeafReaderContext ctx;
|
||||||
|
LongValuesHolder holder = new LongValuesHolder();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected NumericDocValues getNumericDocValues(LeafReaderContext context, String field) throws IOException {
|
||||||
|
ctx = context;
|
||||||
|
return asNumericDocValues(holder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScorer(Scorer scorer) throws IOException {
|
||||||
|
holder.values = producer.getValues(ctx, DoubleValuesSource.fromScorer(scorer));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LongValues toLongValues(NumericDocValues in) {
|
||||||
|
return new LongValues() {
|
||||||
|
@Override
|
||||||
|
public long longValue() throws IOException {
|
||||||
|
return in.longValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean advanceExact(int target) throws IOException {
|
||||||
|
return in.advanceExact(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NumericDocValues asNumericDocValues(LongValuesHolder in) {
|
||||||
|
return new NumericDocValues() {
|
||||||
|
@Override
|
||||||
|
public long longValue() throws IOException {
|
||||||
|
return in.values.longValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean advanceExact(int target) throws IOException {
|
||||||
|
return in.values.advanceExact(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int docID() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int nextDoc() throws IOException {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int advance(int target) throws IOException {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long cost() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.lucene.search;
|
||||||
|
|
||||||
|
import org.apache.lucene.index.LeafReaderContext;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link CollectorManager} implements which wrap a set of {@link CollectorManager}
|
||||||
|
* as {@link MultiCollector} acts for {@link Collector}.
|
||||||
|
*/
|
||||||
|
public class MultiCollectorManager implements CollectorManager<MultiCollectorManager.Collectors, Object[]> {
|
||||||
|
|
||||||
|
final private CollectorManager<Collector, ?>[] collectorManagers;
|
||||||
|
|
||||||
|
public MultiCollectorManager(final CollectorManager... collectorManagers) {
|
||||||
|
this.collectorManagers = collectorManagers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collectors newCollector() throws IOException {
|
||||||
|
return new Collectors();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] reduce(Collection<Collectors> reducableCollectors) throws IOException {
|
||||||
|
final int size = reducableCollectors.size();
|
||||||
|
final Object[] results = new Object[collectorManagers.length];
|
||||||
|
for (int i = 0; i < collectorManagers.length; i++) {
|
||||||
|
final List<Collector> reducableCollector = new ArrayList<>(size);
|
||||||
|
for (Collectors collectors : reducableCollectors)
|
||||||
|
reducableCollector.add(collectors.collectors[i]);
|
||||||
|
results[i] = collectorManagers[i].reduce(reducableCollector);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Collectors implements Collector {
|
||||||
|
|
||||||
|
private final Collector[] collectors;
|
||||||
|
|
||||||
|
private Collectors() throws IOException {
|
||||||
|
collectors = new Collector[collectorManagers.length];
|
||||||
|
for (int i = 0; i < collectors.length; i++)
|
||||||
|
collectors[i] = collectorManagers[i].newCollector();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
final public LeafCollector getLeafCollector(final LeafReaderContext context) throws IOException {
|
||||||
|
return new LeafCollectors(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
final public boolean needsScores() {
|
||||||
|
for (Collector collector : collectors)
|
||||||
|
if (collector.needsScores())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LeafCollectors implements LeafCollector {
|
||||||
|
|
||||||
|
private final LeafCollector[] leafCollectors;
|
||||||
|
|
||||||
|
private LeafCollectors(final LeafReaderContext context) throws IOException {
|
||||||
|
leafCollectors = new LeafCollector[collectors.length];
|
||||||
|
for (int i = 0; i < collectors.length; i++)
|
||||||
|
leafCollectors[i] = collectors[i].getLeafCollector(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
final public void setScorer(final Scorer scorer) throws IOException {
|
||||||
|
for (LeafCollector leafCollector : leafCollectors)
|
||||||
|
if (leafCollector != null)
|
||||||
|
leafCollector.setScorer(scorer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
final public void collect(final int doc) throws IOException {
|
||||||
|
for (LeafCollector leafCollector : leafCollectors)
|
||||||
|
if (leafCollector != null)
|
||||||
|
leafCollector.collect(doc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -38,5 +38,5 @@ public abstract class SimpleFieldComparator<T> extends FieldComparator<T> implem
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setScorer(Scorer scorer) {}
|
public void setScorer(Scorer scorer) throws IOException {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import org.apache.lucene.store.ByteBufferGuard.BufferCleaner;
|
import org.apache.lucene.store.ByteBufferGuard.BufferCleaner;
|
||||||
|
@ -174,14 +175,13 @@ public class MMapDirectory extends FSDirectory {
|
||||||
* is closed while another thread is still accessing it (SIGSEGV).
|
* is closed while another thread is still accessing it (SIGSEGV).
|
||||||
* <p>To enable the hack, the following requirements need to be
|
* <p>To enable the hack, the following requirements need to be
|
||||||
* fulfilled: The used JVM must be Oracle Java / OpenJDK 8
|
* fulfilled: The used JVM must be Oracle Java / OpenJDK 8
|
||||||
* <em>(preliminary support for Java 9 was added with Lucene 6)</em>.
|
* <em>(preliminary support for Java 9 EA build 150+ was added with Lucene 6.4)</em>.
|
||||||
* In addition, the following permissions need to be granted
|
* In addition, the following permissions need to be granted
|
||||||
* to {@code lucene-core.jar} in your
|
* to {@code lucene-core.jar} in your
|
||||||
* <a href="http://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html">policy file</a>:
|
* <a href="http://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html">policy file</a>:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@code permission java.lang.reflect.ReflectPermission "suppressAccessChecks";}</li>
|
* <li>{@code permission java.lang.reflect.ReflectPermission "suppressAccessChecks";}</li>
|
||||||
* <li>{@code permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";}</li>
|
* <li>{@code permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";}</li>
|
||||||
* <li>{@code permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.ref";}</li>
|
|
||||||
* </ul>
|
* </ul>
|
||||||
* @throws IllegalArgumentException if {@link #UNMAP_SUPPORTED}
|
* @throws IllegalArgumentException if {@link #UNMAP_SUPPORTED}
|
||||||
* is <code>false</code> and the workaround cannot be enabled.
|
* is <code>false</code> and the workaround cannot be enabled.
|
||||||
|
@ -335,64 +335,82 @@ public class MMapDirectory extends FSDirectory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressForbidden(reason = "Needs access to private APIs in DirectBuffer and sun.misc.Cleaner to enable hack")
|
@SuppressForbidden(reason = "Needs access to private APIs in DirectBuffer, sun.misc.Cleaner, and sun.misc.Unsafe to enable hack")
|
||||||
private static Object unmapHackImpl() {
|
private static Object unmapHackImpl() {
|
||||||
final Lookup lookup = lookup();
|
final Lookup lookup = lookup();
|
||||||
try {
|
try {
|
||||||
final Class<?> directBufferClass = Class.forName("java.nio.DirectByteBuffer");
|
try {
|
||||||
|
// *** sun.misc.Unsafe unmapping (Java 9+) ***
|
||||||
final Method m = directBufferClass.getMethod("cleaner");
|
final Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
|
||||||
m.setAccessible(true);
|
// first check if Unsafe has the right method, otherwise we can give up
|
||||||
MethodHandle directBufferCleanerMethod = lookup.unreflect(m);
|
// without doing any security critical stuff:
|
||||||
Class<?> cleanerClass = directBufferCleanerMethod.type().returnType();
|
final MethodHandle unmapper = lookup.findVirtual(unsafeClass, "invokeCleaner",
|
||||||
|
methodType(void.class, ByteBuffer.class));
|
||||||
final MethodHandle cleanMethod;
|
// fetch the unsafe instance and bind it to the virtual MH:
|
||||||
if (Runnable.class.isAssignableFrom(cleanerClass)) {
|
final Field f = unsafeClass.getDeclaredField("theUnsafe");
|
||||||
// early Java 9 impl using Runnable (we do the security check early that the Runnable does at runtime):
|
f.setAccessible(true);
|
||||||
final SecurityManager sm = System.getSecurityManager();
|
final Object theUnsafe = f.get(null);
|
||||||
if (sm != null) {
|
return newBufferCleaner(ByteBuffer.class, unmapper.bindTo(theUnsafe));
|
||||||
sm.checkPackageAccess("jdk.internal.ref");
|
} catch (SecurityException se) {
|
||||||
}
|
// rethrow to report errors correctly (we need to catch it here, as we also catch RuntimeException below!):
|
||||||
// cast return value of cleaner() to Runnable:
|
throw se;
|
||||||
directBufferCleanerMethod = directBufferCleanerMethod.asType(directBufferCleanerMethod.type().changeReturnType(Runnable.class));
|
} catch (ReflectiveOperationException | RuntimeException e) {
|
||||||
cleanerClass = Runnable.class;
|
// *** sun.misc.Cleaner unmapping (Java 8) ***
|
||||||
// lookup run() method on the interface instead of Cleaner:
|
final Class<?> directBufferClass = Class.forName("java.nio.DirectByteBuffer");
|
||||||
cleanMethod = lookup.findVirtual(cleanerClass, "run", methodType(void.class));
|
|
||||||
} else {
|
final Method m = directBufferClass.getMethod("cleaner");
|
||||||
// can be either the old internal "sun.misc.Cleaner" or
|
m.setAccessible(true);
|
||||||
// the new Java 9 "java.lang.ref.Cleaner$Cleanable":
|
final MethodHandle directBufferCleanerMethod = lookup.unreflect(m);
|
||||||
cleanMethod = lookup.findVirtual(cleanerClass, "clean", methodType(void.class));
|
final Class<?> cleanerClass = directBufferCleanerMethod.type().returnType();
|
||||||
|
|
||||||
|
/* "Compile" a MH that basically is equivalent to the following code:
|
||||||
|
* void unmapper(ByteBuffer byteBuffer) {
|
||||||
|
* sun.misc.Cleaner cleaner = ((java.nio.DirectByteBuffer) byteBuffer).cleaner();
|
||||||
|
* if (Objects.nonNull(cleaner)) {
|
||||||
|
* cleaner.clean();
|
||||||
|
* } else {
|
||||||
|
* noop(cleaner); // the noop is needed because MethodHandles#guardWithTest always needs ELSE
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
final MethodHandle cleanMethod = lookup.findVirtual(cleanerClass, "clean", methodType(void.class));
|
||||||
|
final MethodHandle nonNullTest = lookup.findStatic(Objects.class, "nonNull", methodType(boolean.class, Object.class))
|
||||||
|
.asType(methodType(boolean.class, cleanerClass));
|
||||||
|
final MethodHandle noop = dropArguments(constant(Void.class, null).asType(methodType(void.class)), 0, cleanerClass);
|
||||||
|
final MethodHandle unmapper = filterReturnValue(directBufferCleanerMethod, guardWithTest(nonNullTest, cleanMethod, noop))
|
||||||
|
.asType(methodType(void.class, ByteBuffer.class));
|
||||||
|
return newBufferCleaner(directBufferClass, unmapper);
|
||||||
}
|
}
|
||||||
|
} catch (SecurityException se) {
|
||||||
final MethodHandle nonNullTest = lookup.findStatic(Objects.class, "nonNull", methodType(boolean.class, Object.class))
|
return "Unmapping is not supported, because not all required permissions are given to the Lucene JAR file: " + se +
|
||||||
.asType(methodType(boolean.class, cleanerClass));
|
" [Please grant at least the following permissions: RuntimePermission(\"accessClassInPackage.sun.misc\") " +
|
||||||
final MethodHandle noop = dropArguments(constant(Void.class, null).asType(methodType(void.class)), 0, cleanerClass);
|
" and ReflectPermission(\"suppressAccessChecks\")]";
|
||||||
final MethodHandle unmapper = filterReturnValue(directBufferCleanerMethod, guardWithTest(nonNullTest, cleanMethod, noop))
|
|
||||||
.asType(methodType(void.class, ByteBuffer.class));
|
|
||||||
|
|
||||||
return (BufferCleaner) (String resourceDescription, ByteBuffer buffer) -> {
|
|
||||||
if (directBufferClass.isInstance(buffer)) {
|
|
||||||
final Throwable error = AccessController.doPrivileged((PrivilegedAction<Throwable>) () -> {
|
|
||||||
try {
|
|
||||||
unmapper.invokeExact(buffer);
|
|
||||||
return null;
|
|
||||||
} catch (Throwable t) {
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (error != null) {
|
|
||||||
throw new IOException("Unable to unmap the mapped buffer: " + resourceDescription, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} catch (SecurityException e) {
|
|
||||||
return "Unmapping is not supported, because not all required permissions are given to the Lucene JAR file: " + e +
|
|
||||||
" [Please grant at least the following permissions: RuntimePermission(\"accessClassInPackage.sun.misc\"), " +
|
|
||||||
"RuntimePermission(\"accessClassInPackage.jdk.internal.ref\"), and " +
|
|
||||||
"ReflectPermission(\"suppressAccessChecks\")]";
|
|
||||||
} catch (ReflectiveOperationException | RuntimeException e) {
|
} catch (ReflectiveOperationException | RuntimeException e) {
|
||||||
return "Unmapping is not supported on this platform, because internal Java APIs are not compatible to this Lucene version: " + e;
|
return "Unmapping is not supported on this platform, because internal Java APIs are not compatible to this Lucene version: " + e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static BufferCleaner newBufferCleaner(final Class<?> unmappableBufferClass, final MethodHandle unmapper) {
|
||||||
|
assert Objects.equals(methodType(void.class, ByteBuffer.class), unmapper.type());
|
||||||
|
return (String resourceDescription, ByteBuffer buffer) -> {
|
||||||
|
if (!buffer.isDirect()) {
|
||||||
|
throw new IllegalArgumentException("unmapping only works with direct buffers");
|
||||||
|
}
|
||||||
|
if (!unmappableBufferClass.isInstance(buffer)) {
|
||||||
|
throw new IllegalArgumentException("buffer is not an instance of " + unmappableBufferClass.getName());
|
||||||
|
}
|
||||||
|
final Throwable error = AccessController.doPrivileged((PrivilegedAction<Throwable>) () -> {
|
||||||
|
try {
|
||||||
|
unmapper.invokeExact(buffer);
|
||||||
|
return null;
|
||||||
|
} catch (Throwable t) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (error != null) {
|
||||||
|
throw new IOException("Unable to unmap the mapped buffer: " + resourceDescription, error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue