http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/docker/memcached/Dockerfile ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/docker/memcached/Dockerfile b/internals/testsupport-internal/src/main/docker/memcached/Dockerfile new file mode 100644 index 0000000..0b1a4b2 --- /dev/null +++ b/internals/testsupport-internal/src/main/docker/memcached/Dockerfile @@ -0,0 +1,16 @@ +# 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. + +FROM @memcached@
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/docker/mysql/Dockerfile ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/docker/mysql/Dockerfile b/internals/testsupport-internal/src/main/docker/mysql/Dockerfile new file mode 100644 index 0000000..967d45d --- /dev/null +++ b/internals/testsupport-internal/src/main/docker/mysql/Dockerfile @@ -0,0 +1,16 @@ +# 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. + +FROM @mariadb@ \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/docker/postgres/Dockerfile ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/docker/postgres/Dockerfile b/internals/testsupport-internal/src/main/docker/postgres/Dockerfile new file mode 100644 index 0000000..d3dad53 --- /dev/null +++ b/internals/testsupport-internal/src/main/docker/postgres/Dockerfile @@ -0,0 +1,17 @@ +# 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. + +FROM @postgres@ +COPY init-test-db.sh /docker-entrypoint-initdb.d/init-test-db.sh http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/docker/postgres/init-test-db.sh ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/docker/postgres/init-test-db.sh b/internals/testsupport-internal/src/main/docker/postgres/init-test-db.sh new file mode 100755 index 0000000..347d78d --- /dev/null +++ b/internals/testsupport-internal/src/main/docker/postgres/init-test-db.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# 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. + +set -e + +# Create test user and database +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL + CREATE USER jdbc_test_login; + CREATE DATABASE jdbc_test_db; + GRANT ALL PRIVILEGES ON DATABASE jdbc_test_db TO jdbc_test_login; +EOSQL + +# Enable ltree extension on test database +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" -d jdbc_test_db <<-EOSQL + CREATE EXTENSION ltree; +EOSQL http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/docker/redis/Dockerfile ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/docker/redis/Dockerfile b/internals/testsupport-internal/src/main/docker/redis/Dockerfile new file mode 100644 index 0000000..d0e67fc --- /dev/null +++ b/internals/testsupport-internal/src/main/docker/redis/Dockerfile @@ -0,0 +1,16 @@ +# 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. + +FROM @redis@ http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/docker/riak/Dockerfile ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/docker/riak/Dockerfile b/internals/testsupport-internal/src/main/docker/riak/Dockerfile new file mode 100644 index 0000000..776d7af --- /dev/null +++ b/internals/testsupport-internal/src/main/docker/riak/Dockerfile @@ -0,0 +1,16 @@ +# 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. + +FROM @riak@ http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/docker/s3server/Dockerfile ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/docker/s3server/Dockerfile b/internals/testsupport-internal/src/main/docker/s3server/Dockerfile new file mode 100644 index 0000000..a4bff87 --- /dev/null +++ b/internals/testsupport-internal/src/main/docker/s3server/Dockerfile @@ -0,0 +1,20 @@ +# 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. + +FROM @s3server@ + +# See https://github.com/scality/S3/blob/master/DOCKER.md +ENV SCALITY_ACCESS_KEY_ID dummyIdentifier +ENV SCALITY_SECRET_ACCESS_KEY dummyCredential http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DelayChecker.java ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DelayChecker.java b/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DelayChecker.java new file mode 100644 index 0000000..36de1ea --- /dev/null +++ b/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DelayChecker.java @@ -0,0 +1,60 @@ +/* + * 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.polygene.test.docker; + +import pl.domzal.junit.docker.rule.wait.StartCondition; +import pl.domzal.junit.docker.rule.wait.StartConditionCheck; + +class DelayChecker + implements StartCondition +{ + + private final long millis; + private final long doneAt; + + DelayChecker( long millis ) + { + this.millis = millis; + this.doneAt = System.currentTimeMillis() + millis; + } + + @Override + public StartConditionCheck build( pl.domzal.junit.docker.rule.DockerRule currentRule ) + { + return new StartConditionCheck() + { + + @Override + public boolean check() + { + return System.currentTimeMillis() > doneAt; + } + + @Override + public String describe() + { + return String.format( "delay check %d ms", millis ); + } + + @Override + public void after() + { + } + }; + } +} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DockerRule.java ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DockerRule.java b/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DockerRule.java new file mode 100644 index 0000000..18fab0f --- /dev/null +++ b/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/DockerRule.java @@ -0,0 +1,156 @@ +/* + * 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.polygene.test.docker; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import pl.domzal.junit.docker.rule.DockerRuleBuilder; +import pl.domzal.junit.docker.rule.WaitFor; +import pl.domzal.junit.docker.rule.wait.LineListener; +import pl.domzal.junit.docker.rule.wait.StartCondition; +import pl.domzal.junit.docker.rule.wait.StartConditionCheck; + +import static java.util.stream.Collectors.joining; +import static org.junit.Assume.assumeFalse; + +public class DockerRule + implements TestRule +{ + private final boolean dockerDisabled = Boolean.valueOf( System.getProperty( "DOCKER_DISABLED", "false" ) ); + private final pl.domzal.junit.docker.rule.DockerRule dockerRule; + + public DockerRule( String image, int... portsToWaitFor ) + { + this( image, null, WaitFor.tcpPort( portsToWaitFor ) ); + } + + public DockerRule( String image, String... logMessageSequenceToWaitFor ) + { + this( image, null, WaitFor.logMessageSequence( logMessageSequenceToWaitFor ) ); + } + + public DockerRule( String image, Map<String, String> environment, String... logMessageSequnceToWaitFor ) + { + this( image, environment, WaitFor.logMessageSequence( logMessageSequnceToWaitFor ) ); + } + + public DockerRule( String image, Long delay, int... portsToWaitFor ) + { + this( image, null, new DelayChecker( delay ), WaitFor.tcpPort( portsToWaitFor ), new DelayChecker( delay ) ); + } + + public DockerRule( String image, Long delay, String... logMessageSequenceToWaitFor ) + { + this( image, null, WaitFor.logMessageSequence( logMessageSequenceToWaitFor ), new DelayChecker( delay ) ); + } + + public DockerRule( String image, Map<String, String> environment, Long delay, String... logMessageSequnceToWaitFor ) + { + this( image, environment, WaitFor.logMessageSequence( logMessageSequnceToWaitFor ), new DelayChecker( delay ) ); + } + + public DockerRule( String image, Map<String, String> environment, StartCondition... waitFor ) + { + if( environment == null ) + { + environment = Collections.emptyMap(); + } + if( dockerDisabled ) + { + dockerRule = null; + } + else + { + DockerRuleBuilder builder = pl.domzal.junit.docker.rule.DockerRule + .builder() + .imageName( "org.apache.polygene:org.apache.polygene.internal.docker-" + image ) + .publishAllPorts( true ) + .waitForTimeout( 120 ) + .waitFor( rule -> new AndChecker( rule, waitFor ) ); + environment.forEach( builder::env ); + dockerRule = builder.build(); + } + } + + @Override + public Statement apply( Statement base, Description description ) + { + assumeFalse( dockerDisabled ); + return dockerRule.apply( base, description ); + } + + public String getDockerHost() + { + return dockerRule.getDockerHost(); + } + + public int getExposedContainerPort( String containerPort ) + { + return Integer.valueOf( dockerRule.getExposedContainerPort( containerPort ) ); + } + + public class AndChecker + implements StartConditionCheck, LineListener + { + private List<StartConditionCheck> allOf; + + public AndChecker( pl.domzal.junit.docker.rule.DockerRule rule, StartCondition... allOf ) + { + this.allOf = Arrays.stream( allOf ).map( cond -> cond.build( rule ) ).collect( Collectors.toList() ); + } + + @Override + public boolean check() + { + return allOf.stream() + .allMatch( StartConditionCheck::check ); + } + + @Override + public String describe() + { + return allOf.stream() + .map( StartConditionCheck::describe ) + .collect( joining( ",", "and(", ")" ) ); + } + + @Override + public void after() + { + allOf.forEach( StartConditionCheck::after ); + } + + @Override + public void nextLine( String line ) + { + allOf.forEach( listener -> + { + if( listener instanceof LineListener ) + { + ( (LineListener) listener ).nextLine( line ); + } + } ); + } + } +} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/package.html ---------------------------------------------------------------------- diff --git a/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/package.html b/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/package.html new file mode 100644 index 0000000..48031f2 --- /dev/null +++ b/internals/testsupport-internal/src/main/java/org/apache/polygene/test/docker/package.html @@ -0,0 +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. + ~ + ~ +--> + +<html> +<body> +<h1>Polygene Internal Docker TestSupport.</h1> +</body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/settings.gradle ---------------------------------------------------------------------- diff --git a/settings.gradle b/settings.gradle index 2e91a9f..3c44077 100644 --- a/settings.gradle +++ b/settings.gradle @@ -99,4 +99,6 @@ include 'core:api', 'samples:sql-support', 'samples:swing' +include 'internals:testsupport-internal' + include 'manual', 'reports', 'distributions', 'release' http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/tools/generator-polygene/app/index.js ---------------------------------------------------------------------- diff --git a/tools/generator-polygene/app/index.js b/tools/generator-polygene/app/index.js index f027b6d..cb9d214 100644 --- a/tools/generator-polygene/app/index.js +++ b/tools/generator-polygene/app/index.js @@ -128,13 +128,12 @@ module.exports = generators.Base.extend( type: 'list', name: 'dbpool', choices: [ - 'None', 'BoneCP', 'DBCP' // 'HikariCP' ], message: 'Which entity store do you want to use?', - default: polygene.dbpool ? polygene.dbpool : "None", + default: polygene.dbpool ? polygene.dbpool : "DBCP", when: function (answers) { return answers.entitystore.indexOf('SQL') > -1; } @@ -210,6 +209,7 @@ module.exports = generators.Base.extend( this.log('Caching:', answers.caching); this.log('Serialization:', answers.serialization); this.log('Features:', answers.features); + answers.dbpool = answers.dbpool === undefined ? "DBCP" : answers.dbpool; polygene = answers; }.bind(this) ); http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/bootstrap.tmpl ---------------------------------------------------------------------- diff --git a/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/bootstrap.tmpl b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/bootstrap.tmpl index 0b050aa..8f902e9 100644 --- a/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/bootstrap.tmpl +++ b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/bootstrap.tmpl @@ -25,7 +25,13 @@ import org.apache.polygene.bootstrap.LayerAssembly; import org.apache.polygene.bootstrap.ModuleAssembly; import org.apache.polygene.bootstrap.layered.ModuleAssembler; import org.apache.polygene.index.<%- polygene.indexing.toLowerCase() %>.assembly.<%- polygene.indexing %>IndexingAssembler; - +<% +if( polygene.indexing === 'SQL' ) { +%>import org.apache.polygene.library.sql.assembly.DataSourceAssembler; +import org.apache.polygene.library.sql.dbcp.DBCPDataSourceServiceAssembler; +<% +} +%> public class <%- polygene.indexing %>IndexingModule implements ModuleAssembler { @@ -41,7 +47,24 @@ public class <%- polygene.indexing %>IndexingModule public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module ) throws AssemblyException { - new <%- polygene.indexing %>IndexingAssembler() +<% if( polygene.indexing === 'SQL' ) { +%> // DataSourceService + new DBCPDataSourceServiceAssembler() + .identifiedBy( "postgres-index-datasource-service" ) + .visibleIn( Visibility.module ) + .withConfig( configModule, Visibility.application ) + .assemble( module ); + + // DataSource (Only Postgresql was supported at the time of generation code was written.) + new DataSourceAssembler() + .withDataSourceServiceIdentity( "postgres-index-datasource-service" ) + .identifiedBy( "ds-index-postgresql" ) + .visibleIn( Visibility.module ) + .withCircuitBreaker() + .assemble( module ); +<% +} +%> new <%- polygene.indexing %>IndexingAssembler() .visibleIn( Visibility.application ) .identifiedBy( "indexing-<%- polygene.indexing.toLowerCase() %>" ) .withConfig( configModule, Visibility.application ) http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/ds-index-postgresql.properties ---------------------------------------------------------------------- diff --git a/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/ds-index-postgresql.properties b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/ds-index-postgresql.properties new file mode 100644 index 0000000..4097894 --- /dev/null +++ b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/ds-index-postgresql.properties @@ -0,0 +1,23 @@ +# +# 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. + + +enabled=true +url=jdbc:postgres://127.0.0.1:5432/<%= polygene.name %> +driver=org.postgresql.Driver +username=polygene +password=ThisIsGreat! http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/index-rdf.properties ---------------------------------------------------------------------- diff --git a/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/index-rdf.properties b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/index-rdf.properties new file mode 100644 index 0000000..bec1996 --- /dev/null +++ b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/index-rdf.properties @@ -0,0 +1,57 @@ +# +# 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. + + + +# Indexing strategy. +# s = subject +# p = predicate +# o = object +# c = context +# +# These are then combined in groups of "one each" such as "spoc" or "pocs". +# Multiple groups can be given, in which case multiple indexs will be +# maintained. +# +# This will heavily influence both indexing as well as query times, and one +# should experiment for optimal performance. +# +# +# @Matches( "([spoc][spoc][spoc][spoc],?)*" ) +# Default: +# +# tripleIndexes- + +# The location of storing the index. +# +# If the FileConfiguration service is available, then the location is set to +# fc.dataDirectory() + serviceIdentity +# +# Otherwise, if serviceIdentity is null or empty, the location is set to +# "./rdf/repositories/polygene" +# +# Otherwise, if serviceIdentity is a valid value, the location is set to +# "./rdf/repositories/" + serviceIdentity +# +# +# Defaults: <see above> +# dataDirectory= + +# Whether to wait for disk sync. +# +# Defaults: false +# forceSync= http://git-wip-us.apache.org/repos/asf/polygene-java/blob/a5feec04/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/solr-schema.xml ---------------------------------------------------------------------- diff --git a/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/solr-schema.xml b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/solr-schema.xml new file mode 100644 index 0000000..d7f70fb --- /dev/null +++ b/tools/generator-polygene/app/templates/InfrastructureLayer/IndexingModule/indexing/solr-schema.xml @@ -0,0 +1,606 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + ~ 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. + ~ + ~ + --> +<!-- + This is the Solr schema file. This file should be named "schema.xml" and + should be in the conf directory under the solr home + (i.e. ./solr/conf/schema.xml by default) + or located where the classloader for the Solr webapp can find it. + + This example schema is the recommended starting point for users. + It should be kept correct and concise, usable out-of-the-box. + + For more information, on how to customize this file, please see + http://wiki.apache.org/solr/SchemaXml + + PERFORMANCE NOTE: this schema includes many optional features and should not + be used for benchmarking. To improve performance one could + - set stored="false" for all fields possible (esp large fields) when you + only need to search on the field but don't need to return the original + value. + - set indexed="false" if you don't need to search on the field, but only + return the field as a result of searching on other indexed fields. + - remove all unneeded copyField statements + - for best index size and searching performance, set "index" to false + for all general text fields, use copyField to copy them to the + catchall "text" field, and use that for searching. + - For maximum indexing performance, use the StreamingUpdateSolrServer + java client. + - Remember to run the JVM in server mode, and use a higher logging level + that avoids logging every request +--> + +<schema name="solrtest" version="1.2"> + <!-- attribute "name" is the name of this schema and is only used for display purposes. + Applications should change this to reflect the nature of the search collection. + version="1.2" is Solr's version number for the schema syntax and semantics. It should + not normally be changed by applications. + 1.0: multiValued attribute did not exist, all fields are multiValued by nature + 1.1: multiValued attribute introduced, false by default + 1.2: omitTermFreqAndPositions attribute introduced, true by default except for text fields. + --> + + <types> + <!-- field type definitions. The "name" attribute is + just a label to be used by field definitions. The "class" + attribute and any other attributes determine the real + behavior of the fieldType. + Class names starting with "solr" refer to java classes in the + org.apache.solr.analysis package. + --> + + <!-- The StrField type is not analyzed, but indexed/stored verbatim. + - StrField and TextField support an optional compressThreshold which + limits compression (if enabled in the derived fields) to values which + exceed a certain size (in characters). + --> + <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> + <fieldType name="json" class="solr.StrField"/> + + <!-- boolean type: "true" or "false" --> + <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/> + <!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings --> + <fieldtype name="binary" class="solr.BinaryField"/> + + <!-- The optional sortMissingLast and sortMissingFirst attributes are + currently supported on types that are sorted internally as strings. + This includes "string","boolean","sint","slong","sfloat","sdouble","pdate" + - If sortMissingLast="true", then a sort on this field will cause documents + without the field to come after documents with the field, + regardless of the requested sort order (asc or desc). + - If sortMissingFirst="true", then a sort on this field will cause documents + without the field to come before documents with the field, + regardless of the requested sort order. + - If sortMissingLast="false" and sortMissingFirst="false" (the default), + then default lucene sorting will be used which places docs without the + field first in an ascending sort and last in a descending sort. + --> + + <!-- + Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types. + --> + <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> + <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" + positionIncrementGap="0"/> + <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> + <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" + positionIncrementGap="0"/> + + <!-- + Numeric field types that index each value at various levels of precision + to accelerate range queries when the number of values between the range + endpoints is large. See the javadoc for NumericRangeQuery for internal + implementation details. + + Smaller precisionStep values (specified in bits) will lead to more tokens + indexed per value, slightly larger index size, and faster range queries. + A precisionStep of 0 disables indexing at different precision levels. + --> + <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> + <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" + positionIncrementGap="0"/> + <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> + <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" + positionIncrementGap="0"/> + + <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and + is a more restricted form of the canonical representation of dateTime + http://www.w3.org/TR/xmlschema-2/#dateTime + The trailing "Z" designates UTC time and is mandatory. + Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z + All other components are mandatory. + + Expressions can also be used to denote calculations that should be + performed relative to "NOW" to determine the value, ie... + + NOW/HOUR + ... Round to the start of the current hour + NOW-1DAY + ... Exactly 1 day prior to now + NOW/DAY+6MONTHS+3DAYS + ... 6 months and 3 days in the future from the start of + the current day + + Consult the DateField javadocs for more information. + + Note: For faster range queries, consider the tdate type + --> + <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/> + + <!-- A Trie based date field for faster date range queries and date faceting. --> + <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/> + + + <!-- + Note: + These should only be used for compatibility with existing indexes (created with older Solr versions) + or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead. + + Plain numeric field types that store and index the text + value verbatim (and hence don't support range queries, since the + lexicographic ordering isn't equal to the numeric ordering) + --> + <fieldType name="pint" class="solr.IntField" omitNorms="true"/> + <fieldType name="plong" class="solr.LongField" omitNorms="true"/> + <fieldType name="pfloat" class="solr.FloatField" omitNorms="true"/> + <fieldType name="pdouble" class="solr.DoubleField" omitNorms="true"/> + <fieldType name="pdate" class="solr.DateField" sortMissingLast="true" omitNorms="true"/> + + + <!-- + Note: + These should only be used for compatibility with existing indexes (created with older Solr versions) + or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead. + + Numeric field types that manipulate the value into + a string value that isn't human-readable in its internal form, + but with a lexicographic ordering the same as the numeric ordering, + so that range queries work correctly. + --> + <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/> + <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/> + <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/> + <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/> + + + <!-- The "RandomSortField" is not used to store or search any + data. You can declare fields of this type it in your schema + to generate pseudo-random orderings of your docs for sorting + purposes. The ordering is generated based on the field name + and the version of the index, As long as the index version + remains unchanged, and the same field name is reused, + the ordering of the docs will be consistent. + If you want different psuedo-random orderings of documents, + for the same version of the index, use a dynamicField and + change the name + --> + <fieldType name="random" class="solr.RandomSortField" indexed="true"/> + + <!-- solr.TextField allows the specification of custom text analyzers + specified as a tokenizer and a list of token filters. Different + analyzers may be specified for indexing and querying. + + The optional positionIncrementGap puts space between multiple fields of + this type on the same document, with the purpose of preventing false phrase + matching across fields. + + For more info on customizing your analyzer chain, please see + http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters + --> + + <!-- One can also specify an existing Analyzer class that has a + default constructor via the class attribute on the analyzer element + <fieldType name="text_greek" class="solr.TextField"> + <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/> + </fieldType> + --> + + <!-- A text field that only splits on whitespace for exact matching of words --> + <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100"> + <analyzer> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + </analyzer> + </fieldType> + + <!-- A text field that uses WordDelimiterFilter to enable splitting and matching of + words on case-change, alpha numeric boundaries, and non-alphanumeric chars, + so that a query of "wifi" or "wi fi" could match a document containing "Wi-Fi". + Synonyms and stopwords are customized by external files, and stemming is enabled. + --> + <fieldType name="text" class="solr.TextField" positionIncrementGap="100"> + <analyzer type="index"> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- in this example, we will only use synonyms at query time + <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> + --> + <!-- Case insensitive stop word removal. + add enablePositionIncrements=true in both the index and query + analyzers to leave a 'gap' for more accurate phrase queries. + --> + <!-- <filter class="solr.StopFilterFactory" + ignoreCase="true" + words="stopwords.txt" + enablePositionIncrements="true" + /> --> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" + catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> + <filter class="solr.LowerCaseFilterFactory"/> + <!-- <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> --> + </analyzer> + <analyzer type="query"> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> --> + <!-- <filter class="solr.StopFilterFactory" + ignoreCase="true" + words="stopwords.txt" + enablePositionIncrements="true" + /> --> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" + catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> + <filter class="solr.LowerCaseFilterFactory"/> + <!-- <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> --> + </analyzer> + </fieldType> + + <fieldType name="phone" class="solr.TextField" positionIncrementGap="100"> + <analyzer type="index"> + <tokenizer class="org.apache.polygene.index.solr.internal.SingleTokenTokenizerFactory"/> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" + catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/> + </analyzer> + <analyzer type="query"> + <tokenizer class="org.apache.polygene.index.solr.internal.SingleTokenTokenizerFactory"/> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" + catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/> + </analyzer> + </fieldType> + + + <!-- Less flexible matching, but less false matches. Probably not ideal for product names, +but may be good for SKUs. Can insert dashes in the wrong place and still match. --> + <fieldType name="textTight" class="solr.TextField" positionIncrementGap="100"> + <analyzer> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/> + <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> --> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" + catenateWords="1" catenateNumbers="1" catenateAll="0"/> + <filter class="solr.LowerCaseFilterFactory"/> + <!-- <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> --> + <!-- this filter can remove any duplicate tokens that appear at the same position - sometimes + possible with WordDelimiterFilter in conjuncton with stemming. --> + <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> + </analyzer> + </fieldType> + + + <!-- A general unstemmed text field - good if one does not know the language of the field --> + <fieldType name="textgen" class="solr.TextField" positionIncrementGap="100"> + <analyzer type="index"> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> --> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" + catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + <analyzer type="query"> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> + <filter class="solr.StopFilterFactory" + ignoreCase="true" + words="stopwords.txt" + enablePositionIncrements="true" + /> --> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" + catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + </fieldType> + + + <!-- A general unstemmed text field that indexes tokens normally and also + reversed (via ReversedWildcardFilterFactory), to enable more efficient + leading wildcard queries. --> + <fieldType name="text_rev" class="solr.TextField" positionIncrementGap="100"> + <analyzer type="index"> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> --> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" + catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/> + <filter class="solr.LowerCaseFilterFactory"/> + <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" + maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/> + </analyzer> + <analyzer type="query"> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> + <filter class="solr.StopFilterFactory" + ignoreCase="true" + words="stopwords.txt" + enablePositionIncrements="true" + /> --> + <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" + catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + </fieldType> + + <!-- charFilter + WhitespaceTokenizer --> + <!-- + <fieldType name="textCharNorm" class="solr.TextField" positionIncrementGap="100" > + <analyzer> + <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + </analyzer> + </fieldType> + --> + + <!-- This is an example of using the KeywordTokenizer along + With various TokenFilterFactories to produce a sortable field + that does not include some properties of the source text + --> + <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true"> + <analyzer> + <!-- KeywordTokenizer does no actual tokenizing, so the entire + input string is preserved as a single token + --> + <tokenizer class="solr.KeywordTokenizerFactory"/> + <!-- The LowerCase TokenFilter does what you expect, which can be + when you want your sorting to be case insensitive + --> + <filter class="solr.LowerCaseFilterFactory"/> + <!-- The TrimFilter removes any leading or trailing whitespace --> + <filter class="solr.TrimFilterFactory"/> + <!-- The PatternReplaceFilter gives you the flexibility to use + Java Regular expression to replace any sequence of characters + matching a pattern with an arbitrary replacement string, + which may include back references to portions of the original + string matched by the pattern. + + See the Java Regular Expression documentation for more + information on pattern and replacement string syntax. + + http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/package-summary.html + --> + <filter class="solr.PatternReplaceFilterFactory" + pattern="([^a-z])" replacement="" replace="all" + /> + </analyzer> + </fieldType> + + <fieldtype name="phonetic" stored="false" indexed="true" class="solr.TextField"> + <analyzer> + <tokenizer class="solr.StandardTokenizerFactory"/> + <filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/> + </analyzer> + </fieldtype> + + <fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField"> + <analyzer> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- + The DelimitedPayloadTokenFilter can put payloads on tokens... for example, + a token of "foo|1.4" would be indexed as "foo" with a payload of 1.4f + Attributes of the DelimitedPayloadTokenFilterFactory : + "delimiter" - a one character delimiter. Default is | (pipe) + "encoder" - how to encode the following value into a playload + float -> org.apache.lucene.analysis.payloads.FloatEncoder, + integer -> o.a.l.a.p.IntegerEncoder + reference -> o.a.l.a.p.IdentityEncoder + Fully Qualified class name implementing PayloadEncoder, Encoder must have a no arg constructor. + --> + <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="float"/> + </analyzer> + </fieldtype> + + <!-- lowercases the entire field value, keeping it as a single token. --> + <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100"> + <analyzer> + <tokenizer class="solr.KeywordTokenizerFactory"/> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + </fieldType> + + + <!-- since fields of this type are by default not stored or indexed, +any data added to them will be ignored outright. --> + <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField"/> + + </types> + + + <fields> + <!-- Valid attributes for fields: + name: mandatory - the name for the field + type: mandatory - the name of a previously defined type from the + <types> section + indexed: true if this field should be indexed (searchable or sortable) + stored: true if this field should be retrievable + compressed: [false] if this field should be stored using gzip compression + (this will only apply if the field type is compressable; among + the standard field types, only TextField and StrField are) + multiValued: true if this field may contain multiple values per document + omitNorms: (expert) set to true to omit the norms associated with + this field (this disables length normalization and index-time + boosting for the field, and saves some memory). Only full-text + fields or fields that need an index-time boost need norms. + termVectors: [false] set to true to store the term vector for a + given field. + When using MoreLikeThis, fields used for similarity should be + stored for best performance. + termPositions: Store position information with the term vector. + This will increase storage costs. + termOffsets: Store offset information with the term vector. This + will increase storage costs. + default: a value that should be used if no value is specified + when adding a document. + --> + + <!-- Standard entity fields --> + <field name="id" type="string" indexed="true" stored="true" required="true"/> + <field name="lastModified" type="date" indexed="true" stored="true" required="true"/> + <field name="type" type="string" indexed="true" stored="true" required="true"/> + + <!-- Solr test lucene index fields. Replace this with application-specific fields --> + <field name="name" type="text" indexed="true" stored="true" multiValued="false"/> + + <!-- + <field name="sku" type="textTight" indexed="true" stored="true" omitNorms="true"/> + <field name="name" type="textgen" indexed="true" stored="true"/> + <field name="alphaNameSort" type="alphaOnlySort" indexed="true" stored="false"/> + <field name="manu" type="textgen" indexed="true" stored="true" omitNorms="true"/> + <field name="cat" type="text_ws" indexed="true" stored="true" multiValued="true" omitNorms="true" /> + <field name="features" type="text" indexed="true" stored="true" multiValued="true"/> + <field name="includes" type="text" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" /> + + <field name="weight" type="float" indexed="true" stored="true"/> + <field name="price" type="float" indexed="true" stored="true"/> + <field name="popularity" type="int" indexed="true" stored="true" /> + <field name="inStock" type="boolean" indexed="true" stored="true" /> + --> + + <!-- Common metadata fields, named specifically to match up with + SolrCell metadata when parsing rich documents such as Word, PDF. + Some fields are multiValued only because Tika currently may return + multiple values for them. + --> + <!-- + <field name="title" type="text" indexed="true" stored="true" multiValued="true"/> + <field name="subject" type="text" indexed="true" stored="true"/> + <field name="description" type="text" indexed="true" stored="true"/> + <field name="comments" type="text" indexed="true" stored="true"/> + <field name="author" type="textgen" indexed="true" stored="true"/> + <field name="keywords" type="textgen" indexed="true" stored="true"/> + <field name="category" type="textgen" indexed="true" stored="true"/> + <field name="content_type" type="string" indexed="true" stored="true" multiValued="true"/> + <field name="last_modified" type="date" indexed="true" stored="true"/> + <field name="links" type="string" indexed="true" stored="true" multiValued="true"/> + --> + + <!-- catchall field, containing all other searchable text fields (implemented +via copyField further on in this schema --> + <field name="text" type="text" indexed="true" stored="false" multiValued="true"/> + + <!-- catchall text field that indexes tokens both normally and in reverse for efficient + leading wildcard queries. --> + <field name="text_rev" type="text_rev" indexed="true" stored="false" multiValued="true"/> + + <!-- non-tokenized version of manufacturer to make it easier to sort or group +results by manufacturer. copied from "manu" via copyField --> + <!--<field name="manu_exact" type="string" indexed="true" stored="false"/> --> + + <!-- <field name="payloads" type="payloads" indexed="true" stored="true"/> --> + + <!-- Uncommenting the following will create a "timestamp" field using + a default value of "NOW" to indicate when each document was indexed. + --> + <!-- + <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/> + --> + + + <!-- Dynamic field definitions. If a field name is not found, dynamicFields +will be used if the name matches any of the patterns. +RESTRICTION: the glob-like pattern in the name attribute must have +a "*" only at the start or the end. +EXAMPLE: name="*_i" will match any field ending in _i (like myid_i, z_i) +Longer patterns will be matched first. if equal size patterns +both match, the first appearing in the schema will be used. --> + <dynamicField name="*_i" type="int" indexed="true" stored="true"/> + <dynamicField name="*_s" type="string" indexed="true" stored="true"/> + <dynamicField name="*_l" type="long" indexed="true" stored="true"/> + <dynamicField name="*_t" type="text" indexed="true" stored="true"/> + <dynamicField name="*_b" type="boolean" indexed="true" stored="true"/> + <dynamicField name="*_f" type="float" indexed="true" stored="true"/> + <dynamicField name="*_d" type="double" indexed="true" stored="true"/> + <dynamicField name="*_dt" type="date" indexed="true" stored="true"/> + + <!-- some trie-coded dynamic fields for faster range queries --> + <dynamicField name="*_ti" type="tint" indexed="true" stored="true"/> + <dynamicField name="*_tl" type="tlong" indexed="true" stored="true"/> + <dynamicField name="*_tf" type="tfloat" indexed="true" stored="true"/> + <dynamicField name="*_td" type="tdouble" indexed="true" stored="true"/> + <dynamicField name="*_tdt" type="tdate" indexed="true" stored="true"/> + + <dynamicField name="*_pi" type="pint" indexed="true" stored="true"/> + + <dynamicField name="ignored_*" type="ignored" multiValued="true"/> + <dynamicField name="attr_*" type="textgen" indexed="true" stored="true" multiValued="true"/> + + <dynamicField name="random_*" type="random"/> + + <!-- uncomment the following to ignore any fields that don't already match an existing + field name or dynamic field, rather than reporting them as an error. + alternately, change the type="ignored" to some other type e.g. "text" if you want + unknown fields indexed and/or stored by default --> + <!--dynamicField name="*" type="ignored" multiValued="true" /--> + + </fields> + + <!-- Field to use to determine and enforce document uniqueness. + Unless this field is marked with required="false", it will be a required field + --> + <uniqueKey>id</uniqueKey> + + <!-- field for the QueryParser to use when an explicit fieldname is absent --> + <defaultSearchField>text</defaultSearchField> + + <!-- SolrQueryParser configuration: defaultOperator="AND|OR" --> + <solrQueryParser defaultOperator="AND"/> + + <!-- copyField commands copy one field to another at the time a document +is added to the index. It's used either to index the same field differently, +or to add multiple fields to the same field for easier/faster searching. --> + + <copyField source="name" dest="text"/> + + <!-- + <copyField source="manu" dest="text"/> + <copyField source="features" dest="text"/> + <copyField source="includes" dest="text"/> + <copyField source="manu" dest="manu_exact"/> + --> + <!-- Above, multiple source fields are copied to the [text] field. + Another way to map multiple source fields to the same + destination field is to use the dynamic field syntax. + copyField also supports a maxChars to copy setting. --> + + <!-- <copyField source="*_t" dest="text" maxChars="3000"/> --> + + <!-- copy name to alphaNameSort, a field designed for sorting by name --> + <!-- <copyField source="name" dest="alphaNameSort"/> --> + + + <!-- Similarity is the scoring routine for each document vs. a query. +A custom similarity may be specified here, but the default is fine +for most applications. --> + <!-- <similarity class="org.apache.lucene.search.DefaultSimilarity"/> --> + <!-- ... OR ... + Specify a SimilarityFactory class name implementation + allowing parameters to be used. + --> + <!-- + <similarity class="com.example.solr.CustomSimilarityFactory"> + <str name="paramkey">param value</str> + </similarity> + --> + + +</schema>
