RYA-144-ExternalSetMatchingFramework
Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/07643eb7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/07643eb7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/07643eb7 Branch: refs/heads/master Commit: 07643eb7e1de100936ff7487287bab880be572bd Parents: c2a09de Author: Caleb Meier <[email protected]> Authored: Tue Dec 13 12:26:29 2016 -0800 Committer: pujav65 <[email protected]> Committed: Mon Mar 27 12:21:44 2017 -0400 ---------------------------------------------------------------------- .../rya/mongodb/MongoConnectorFactory.java | 12 +- .../indexing/entity/EntityIndexException.java | 57 --- .../mvm/rya/indexing/entity/model/Entity.java | 329 ---------------- .../mvm/rya/indexing/entity/model/Property.java | 83 ---- .../mvm/rya/indexing/entity/model/Type.java | 102 ----- .../rya/indexing/entity/model/TypedEntity.java | 242 ------------ .../indexing/entity/query/EntityQueryNode.java | 238 ----------- .../entity/storage/CloseableIterator.java | 29 -- .../indexing/entity/storage/EntityStorage.java | 153 -------- .../indexing/entity/storage/TypeStorage.java | 106 ----- .../entity/storage/mongo/ConvertingCursor.java | 76 ---- .../entity/storage/mongo/DocumentConverter.java | 65 --- .../storage/mongo/EntityDocumentConverter.java | 123 ------ .../storage/mongo/MongoEntityStorage.java | 244 ------------ .../entity/storage/mongo/MongoTypeStorage.java | 149 ------- .../storage/mongo/RyaTypeDocumentConverter.java | 69 ---- .../storage/mongo/TypeDocumentConverter.java | 80 ---- .../entity/update/BaseEntityIndexer.java | 266 ------------- .../indexing/entity/update/EntityIndexer.java | 31 -- .../indexing/entity/update/EntityUpdater.java | 121 ------ .../entity/update/mongo/MongoEntityIndexer.java | 55 --- .../indexing/entity/EntityIndexException.java | 57 +++ .../rya/indexing/entity/model/Entity.java | 323 +++++++++++++++ .../rya/indexing/entity/model/Property.java | 83 ++++ .../apache/rya/indexing/entity/model/Type.java | 103 +++++ .../rya/indexing/entity/model/TypedEntity.java | 242 ++++++++++++ .../indexing/entity/query/EntityQueryNode.java | 238 +++++++++++ .../entity/storage/CloseableIterator.java | 29 ++ .../indexing/entity/storage/EntityStorage.java | 154 ++++++++ .../indexing/entity/storage/TypeStorage.java | 107 +++++ .../entity/storage/mongo/ConvertingCursor.java | 75 ++++ .../entity/storage/mongo/DocumentConverter.java | 65 +++ .../storage/mongo/EntityDocumentConverter.java | 123 ++++++ .../storage/mongo/MongoEntityStorage.java | 244 ++++++++++++ .../entity/storage/mongo/MongoTypeStorage.java | 149 +++++++ .../storage/mongo/RyaTypeDocumentConverter.java | 69 ++++ .../storage/mongo/TypeDocumentConverter.java | 80 ++++ .../entity/update/BaseEntityIndexer.java | 266 +++++++++++++ .../indexing/entity/update/EntityIndexer.java | 32 ++ .../indexing/entity/update/EntityUpdater.java | 122 ++++++ .../entity/update/mongo/MongoEntityIndexer.java | 55 +++ .../entity/query/EntityQueryNodeTest.java | 194 --------- .../mongo/EntityDocumentConverterTest.java | 60 --- .../storage/mongo/MongoEntityStorageIT.java | 391 ------------------ .../entity/storage/mongo/MongoITBase.java | 81 ---- .../storage/mongo/MongoTypeStorageIT.java | 174 -------- .../mongo/RyaTypeDocumentConverterTest.java | 82 ---- .../mongo/TypeDocumentConverterTest.java | 93 ----- .../update/mongo/MongoEntityIndexerIT.java | 285 -------------- .../entity/query/EntityQueryNodeTest.java | 195 +++++++++ .../mongo/EntityDocumentConverterTest.java | 61 +++ .../storage/mongo/MongoEntityStorageIT.java | 392 +++++++++++++++++++ .../entity/storage/mongo/MongoITBase.java | 81 ++++ .../storage/mongo/MongoTypeStorageIT.java | 175 +++++++++ .../mongo/RyaTypeDocumentConverterTest.java | 83 ++++ .../mongo/TypeDocumentConverterTest.java | 94 +++++ .../update/mongo/MongoEntityIndexerIT.java | 286 ++++++++++++++ .../src/main/gen/META-INF/sun-jaxb.episode | 26 ++ .../rya/benchmark/query/ObjectFactory.java | 113 ++++++ .../apache/rya/benchmark/query/Parameters.java | 257 ++++++++++++ .../benchmark/query/QueriesBenchmarkConf.java | 117 ++++++ .../gen/org/apache/rya/benchmark/query/Rya.java | 351 +++++++++++++++++ 62 files changed, 4853 insertions(+), 3984 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoConnectorFactory.java ---------------------------------------------------------------------- diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoConnectorFactory.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoConnectorFactory.java index 1d07e70..df62a87 100644 --- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoConnectorFactory.java +++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoConnectorFactory.java @@ -6,9 +6,9 @@ * 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 @@ -71,7 +71,7 @@ public class MongoConnectorFactory { } /** - * Create a MongoDB client object and assign it to this class's static mongoClient + * Create a MongoDB client object and assign it to this class's static mongoClient * @param conf configuration containing connection parameters * @throws ConfigurationRuntimeException - Thrown if the configured server, port, user, or others are missing. * @throws MongoException if can't connect despite conf parameters are given @@ -81,7 +81,7 @@ public class MongoConnectorFactory { // Connect to a running Mongo server final String host = requireNonNull(conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE), MSG_INTRO+"host name is required"); final int port = requireNonNullInt(conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE_PORT), MSG_INTRO+"Port number is required."); - final ServerAddress server = new ServerAddress(host, port); + ServerAddress server = new ServerAddress(host, port); // check for authentication credentials if (conf.get(MongoDBRdfConfiguration.MONGO_USER) != null) { final String username = conf.get(MongoDBRdfConfiguration.MONGO_USER); @@ -101,7 +101,7 @@ public class MongoConnectorFactory { /** * Throw exception for un-configured required values. - * + * * @param required String to check * @param message throw configuration exception with this description * @return unaltered required string @@ -123,7 +123,7 @@ public class MongoConnectorFactory { } try { return Integer.parseInt(required); - } catch (final NumberFormatException e) { + } catch (NumberFormatException e) { throw new ConfigurationRuntimeException(message); } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/EntityIndexException.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/EntityIndexException.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/EntityIndexException.java deleted file mode 100644 index a9e612c..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/EntityIndexException.java +++ /dev/null @@ -1,57 +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. - */ -package mvm.rya.indexing.entity; - -import mvm.rya.indexing.entity.model.TypedEntity; - -/** - * An operation over the {@link TypedEntity} index failed to complete. - */ -public class EntityIndexException extends Exception { - private static final long serialVersionUID = 1L; - - /** - * Constructs a new exception with the specified detail message. The - * cause is not initialized, and may subsequently be initialized by - * a call to {@link #initCause}. - * - * @param message the detail message. The detail message is saved for - * later retrieval by the {@link #getMessage()} method. - */ - public EntityIndexException(final String message) { - super(message); - } - - /** - * Constructs a new exception with the specified detail message and - * cause. <p>Note that the detail message associated with - * {@code cause} is <i>not</i> automatically incorporated in - * this exception's detail message. - * - * @param message the detail message (which is saved for later retrieval - * by the {@link #getMessage()} method). - * @param cause the cause (which is saved for later retrieval by the - * {@link #getCause()} method). (A <tt>null</tt> value is - * permitted, and indicates that the cause is nonexistent or - * unknown.) - */ - public EntityIndexException(final String message, final Throwable cause) { - super(message, cause); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Entity.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Entity.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Entity.java deleted file mode 100644 index 9ac5a3b..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Entity.java +++ /dev/null @@ -1,329 +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. - */ -package mvm.rya.indexing.entity.model; - -import static java.util.Objects.requireNonNull; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Optional; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import javax.annotation.concurrent.Immutable; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import mvm.rya.api.domain.RyaURI; -import mvm.rya.indexing.entity.storage.EntityStorage; - -/** - * An {@link Entity} is a named concept that has at least one defined structure - * and a bunch of values that fit within each of those structures. A structure is - * defined by a {@link Type}. A value that fits within that Type is a {@link Property}. - * </p> - * For example, suppose we want to represent a type of icecream as an Entity. - * First we must define what properties an icecream entity may have: - * <pre> - * Type ID: <urn:icecream> - * Properties: <urn:brand> - * <urn:flavor> - * <urn:ingredients> - * <urn:nutritionalInformation> - * </pre> - * Now we can represent our icecream whose brand is "Awesome Icecream" and whose - * flavor is "Chocolate", but has no ingredients or nutritional information, as - * an Entity by doing the following: - * <pre> - * final Entity entity = Entity.builder() - * .setSubject(new RyaURI("urn:GTIN-14/00012345600012")) - * .setExplicitType(new RyaURI("urn:icecream")) - * .setProperty(new RyaURI("urn:icecream"), new Property(new RyaURI("urn:brand"), new RyaType(XMLSchema.STRING, "Awesome Icecream"))) - * .setProperty(new RyaURI("urn:icecream"), new Property(new RyaURI("urn:flavor"), new RyaType(XMLSchema.STRING, "Chocolate"))) - * .build(); - * </pre> - * The two types of Entities that may be created are implicit and explicit. - * An implicit Entity is one who has at least one {@link Property} that matches - * the {@link Type}, but nothing has explicitly indicated it is of that Type. - * Once something has done so, it is an explicitly typed Entity. - */ -@Immutable -@ParametersAreNonnullByDefault -public class Entity { - - private final RyaURI subject; - private final ImmutableList<RyaURI> explicitTypeIds; - - // First key is Type ID. - // Second key is Property Name. - // Value is the Property value for a specific type. - private final ImmutableMap<RyaURI, ImmutableMap<RyaURI, Property>> properties; - - private final int version; - - /** - * To construct an instances of this class, use {@link Builder}. - */ - private Entity( - final RyaURI subject, - final ImmutableList<RyaURI> explicitTypeIds, - final ImmutableMap<RyaURI, ImmutableMap<RyaURI, Property>> typeProperties, - int version) { - this.subject = requireNonNull(subject); - this.explicitTypeIds = requireNonNull(explicitTypeIds); - this.properties = requireNonNull(typeProperties); - this.version = version; - } - - /** - * @return Identifies the thing that is being represented as an Entity. - */ - public RyaURI getSubject() { - return subject; - } - - /** - * @return {@link Type}s that have been explicitly applied to the {@link Entity}. - */ - public ImmutableList<RyaURI> getExplicitTypeIds() { - return explicitTypeIds; - } - - /** - * @return All {@link Property}s that have been set for the Entity, grouped by Type ID. - */ - public ImmutableMap<RyaURI, ImmutableMap<RyaURI, Property>> getProperties() { - return properties; - } - - /** - * @return The version of this Entity. This value is used by the {@link EntityStorage} - * to prevent stale updates. - */ - public int getVersion() { - return version; - } - - @Override - public int hashCode() { - return Objects.hash(subject, explicitTypeIds, properties, version); - } - - @Override - public boolean equals(Object o) { - if(this == o) { - return true; - } - if(o instanceof Entity) { - final Entity entity = (Entity) o; - return Objects.equals(subject, entity.subject) && - Objects.equals(explicitTypeIds, entity.explicitTypeIds) && - Objects.equals(properties, entity.properties) && - version == entity.version; - } - return false; - } - - /** - * Builds an {@link TypedEntity} using this object's values for the specified {@link Type}. - * - * @param typeId - The ID of the Type the TypedEntity will be for. (not null) - * @return A TypedEntity using this object's values if any properties for the Type - * are present or if the Type was explicitly set. Otherwise an empty {@link Optional}. - */ - public Optional<TypedEntity> makeTypedEntity(RyaURI typeId) { - requireNonNull(typeId); - - final boolean explicitlyHasType = explicitTypeIds.contains(typeId); - final boolean hasTypesProperties = properties.containsKey(typeId); - - // The case where the MongoEntity can be represented as the typeId's Type. - if(explicitlyHasType || hasTypesProperties) { - // Set required fields. - final TypedEntity.Builder builder = TypedEntity.builder() - .setId( subject ) - .setTypeId( typeId ) - .setExplicitelyTyped( explicitTypeIds.contains(typeId) ); - - // Set Type's properties if present. - if(properties.containsKey(typeId)) { - properties.get(typeId).forEach( (propertyName, property) -> builder.setProperty(property)); - } - - return Optional.of( builder.build() ); - } - - // This MongoEntity can not be represented by the typeId's Type. - return Optional.empty(); - } - - /** - * @return An empty instance of {@link Builder}. - */ - public static Builder builder() { - return new Builder(); - } - - /** - * Create a {@link Builder} initialized with an {@link Entity}'s values. - * - * @param entity - The Entity the builder will be based on. (not null) - * @return A {@link Builder} loaded with {@code entity}'s values. - */ - public static Builder builder(Entity entity) { - return new Builder(entity); - } - - /** - * Builds instances of {@link Entity}. - */ - @ParametersAreNonnullByDefault - public static class Builder { - - private RyaURI subject = null; - private final List<RyaURI> explicitTypes = new ArrayList<>(); - private final Map<RyaURI, Map<RyaURI, Property>> properties = new HashMap<>(); - - private int version = 0; - - /** - * Constructs an empty instance of {@link Builder}. - */ - public Builder() { } - - /** - * Constructs an instance of {@link Builder}. - * - * @param entity - The Entity the builder will be based on. (not null) - */ - public Builder(Entity entity) { - requireNonNull(entity); - - subject = entity.getSubject(); - explicitTypes.addAll( entity.getExplicitTypeIds() ); - - for(final Entry<RyaURI, ImmutableMap<RyaURI, Property>> entry : entity.getProperties().entrySet()) { - this.properties.put(entry.getKey(), Maps.newHashMap(entry.getValue())); - } - - version = entity.getVersion(); - } - - /** - * @param subject - Identifies the {@link TypedEntity}. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setSubject(@Nullable final RyaURI subject) { - this.subject = subject; - return this; - } - - /** - * @param typeId - A {@link Type} that has been explicity set for the {@link TypedEntity}. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setExplicitType(@Nullable final RyaURI typeId) { - if(typeId != null) { - explicitTypes.add(typeId); - } - return this; - } - - /** - * Removed a Type ID from the set of explicit Type IDs. - * - * @param typeId - The Type ID to remove from the set of explicit types. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder unsetExplicitType(@Nullable final RyaURI typeId) { - if(typeId != null) { - explicitTypes.remove(typeId); - } - return this; - } - - /** - * Adds a {@link Property} for a specific {@link Type} of {@link TypedEntity}. - * - * @param typeId - The Type the Property is for. - * @param property - The Property values to add. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setProperty(@Nullable final RyaURI typeId, @Nullable final Property property) { - if(typeId != null && property != null) { - if(!properties.containsKey(typeId)) { - properties.put(typeId, new HashMap<>()); - } - - properties.get(typeId).put(property.getName(), property); - } - return this; - } - - /** - * Removes a {@link Property} for a specific {@link Type} of {@link TypedEntity}. - * - * @param typeId - The Type the Property will be removed from. - * @param propertyName - The name of the Property to remove. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder unsetProperty(@Nullable final RyaURI typeId, @Nullable final RyaURI propertyName) { - if(typeId != null && propertyName != null) { - if(properties.containsKey(typeId)) { - final Map<RyaURI, Property> typedProperties = properties.get(typeId); - if(typedProperties.containsKey(propertyName)) { - typedProperties.remove(propertyName); - } - } - } - return this; - } - - /** - * @param version - The version of this Entity. This value is used by the - * {@link EntityStorage} to prevent stale updates. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setVersion(int version) { - this.version = version; - return this; - } - - /** - * @return Builds an instance of {@link Entity} using this builder's values. - */ - public Entity build() { - final ImmutableMap.Builder<RyaURI, ImmutableMap<RyaURI, Property>> propertiesBuilder = ImmutableMap.builder(); - for(final Entry<RyaURI, Map<RyaURI, Property>> entry : properties.entrySet()) { - propertiesBuilder.put(entry.getKey(), ImmutableMap.copyOf( entry.getValue() )); - } - - return new Entity(subject, - ImmutableList.copyOf( explicitTypes ), - propertiesBuilder.build(), - version); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Property.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Property.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Property.java deleted file mode 100644 index 67c2fdb..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Property.java +++ /dev/null @@ -1,83 +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. - */ -package mvm.rya.indexing.entity.model; - -import static java.util.Objects.requireNonNull; - -import java.util.Objects; - -import javax.annotation.ParametersAreNonnullByDefault; -import javax.annotation.concurrent.Immutable; - -import mvm.rya.api.domain.RyaType; -import mvm.rya.api.domain.RyaURI; - -/** - * A value that has been set for an {@link TypedEntity}. - */ -@Immutable -@ParametersAreNonnullByDefault -public class Property { - - private final RyaURI name; - private final RyaType value; - - /** - * Constructs an instance of {@link Property}. - * - * @param name - Uniquely identifies the {@link Property}. (not null) - * @param value - The value of the {@link Property}. (not null) - */ - public Property(final RyaURI name, final RyaType value) { - this.name = requireNonNull(name); - this.value = requireNonNull(value); - } - - /** - * @return Uniquely identifies the {@link Property}. - */ - public RyaURI getName() { - return name; - } - - /** - * @return The value of the {@link Property}. - */ - public RyaType getValue() { - return value; - } - - @Override - public int hashCode() { - return Objects.hash(name, value); - } - - @Override - public boolean equals(final Object o) { - if(this == o) { - return true; - } - if(o instanceof Property) { - final Property field = (Property) o; - return Objects.equals(name, field.name) && - Objects.equals(value, field.value); - } - return false; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Type.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Type.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Type.java deleted file mode 100644 index 26da572..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/Type.java +++ /dev/null @@ -1,102 +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. - */ -package mvm.rya.indexing.entity.model; - -import static java.util.Objects.requireNonNull; - -import java.util.Objects; - -import javax.annotation.ParametersAreNonnullByDefault; -import javax.annotation.concurrent.Immutable; - -import com.google.common.collect.ImmutableSet; - -import mvm.rya.api.domain.RyaURI; -import mvm.rya.indexing.entity.storage.TypeStorage; - -/** - * Defines the structure of an {@link TypedEntity}. - * </p> - * For example, suppose you want a {@link Type} that defines what properties are - * available for icecream. It could be modeled like this: - * <pre> - * Type ID: <urn:icecream> - * Properties: <urn:brand> - * <urn:flavor> - * <urn:ingredients> - * <urn:nutritionalInformation> - * </pre> - */ -@Immutable -@ParametersAreNonnullByDefault -public class Type { - - /** - * Uniquely identifies the Type within a {@link TypeStorage}. - */ - private final RyaURI id; - - /** - * The names of {@link Property}s that may be part of an {@link TypedEntity} of this type. - */ - private final ImmutableSet<RyaURI> propertyNames; - - /** - * Constructs an instance of {@link Type}. - * - * @param id - Uniquely identifies the Type within a {@link TypeStorage}. (not null) - * @param propertyNames - The names of {@link Property}s that may be part of an {@link TypedEntity} of this type. (not null) - */ - public Type(final RyaURI id, final ImmutableSet<RyaURI> propertyNames) { - this.id = requireNonNull(id); - this.propertyNames = requireNonNull(propertyNames); - } - - /** - * @return Uniquely identifies the Type within a {@link TypeStorage}. - */ - public RyaURI getId() { - return id; - } - - /** - * @return The names of {@link Property}s that may be part of an {@link TypedEntity} of this type. - */ - public ImmutableSet<RyaURI> getPropertyNames() { - return propertyNames; - } - - @Override - public int hashCode() { - return Objects.hash(id, propertyNames); - } - - @Override - public boolean equals(final Object o) { - if(this == o) { - return true; - } - if(o instanceof Type) { - final Type type = (Type) o; - return Objects.equals(id, type.id) && - Objects.equals(propertyNames, type.propertyNames); - } - return false; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/TypedEntity.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/TypedEntity.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/TypedEntity.java deleted file mode 100644 index 1d2bc86..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/model/TypedEntity.java +++ /dev/null @@ -1,242 +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. - */ -package mvm.rya.indexing.entity.model; - -import static java.util.Objects.requireNonNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import javax.annotation.concurrent.Immutable; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableCollection; -import com.google.common.collect.ImmutableMap; - -import mvm.rya.api.domain.RyaType; -import mvm.rya.api.domain.RyaURI; - -/** - * A {@link TypedEntity} is a view of an {@link Entity} that has had a specific - * {@link Type} applied to it. - */ -@Immutable -@ParametersAreNonnullByDefault -public class TypedEntity { - - /** - * The Subject of the {@link Entity} this view was derived from. - */ - private final RyaURI subject; - - /** - * The ID of the {@link Type} that defines the structure of this TypedEntity. - */ - private final RyaURI typeId; - - /** - * {@code true} if the Entity's Type has been explicitly set to the {@link #typeId} - * value; {@code false} if it is implicit (this Entity only exists because it has - * properties that happen to match that type's properties). - */ - private final boolean explicitlyTyped; - - /** - * The optional {@link Property} values of this {@link TypedEntity}. - * </p> - * They are mapped from property name to property object for quick lookup. - */ - private final ImmutableMap<RyaURI, Property> optionalFields; - - /** - * Constructs an instance of {@link TypedEntity}. - * - * @param subject - The Subject of the {@link Entity} this view was derived from. (not null) - * @param dataTypeId - The ID of the {@link Type} that defines the structure of this Entity. (not null) - * @param explicitlyTyped - {@code true} if the Entity's Type has been explicitly set to the - * {@link #typeId} value; {@code false} if it is implicit (this Entity only exists because - * it has properties that happen to match that type's properties). - * @param properties - The optional {@link Property} values of this {@link TypedEntity}. (not null) - */ - private TypedEntity(final RyaURI subject, - final RyaURI dataTypeId, - boolean explicitlyTyped, - final ImmutableMap<RyaURI, Property> optionalFields) { - this.subject = requireNonNull(subject); - this.typeId = requireNonNull(dataTypeId); - this.optionalFields = requireNonNull(optionalFields); - this.explicitlyTyped = explicitlyTyped; - } - - /** - * @return The Subject of the {@link Entity} this view was derived from. - */ - public RyaURI getSubject() { - return subject; - } - - /** - * @return The ID of the {@link Type} that defines the structure of this Entity. - */ - public RyaURI getTypeId() { - return typeId; - } - - /** - * @return {@code true} if the Entity's Type has been explicitly set to the {@link #typeId} - * value; {@code false} if it is implicit (this Entity only exists because it has - * properties that happen to match that type's properties). - */ - public boolean isExplicitlyTyped() { - return explicitlyTyped; - } - - /** - * @return The optional {@link Property} values of this {@link TypedEntity}. - */ - public ImmutableCollection<Property> getProperties() { - return optionalFields.values(); - } - - /** - * Get the value of a specific {@link Property} of this {@link TypedEntity} - * if the property has been set. - * - * @param propertyName - The name of {@link Property} that may be in this Entity. (not null) - * @return The value of the Property if it has been set. - */ - public Optional<RyaType> getPropertyValue(final RyaURI propertyName) { - requireNonNull(propertyName); - - final Property field = optionalFields.get(propertyName); - return field == null ? - Optional.absent() : - Optional.of( field.getValue() ); - } - - @Override - public int hashCode() { - return Objects.hash(subject, typeId, optionalFields); - } - - @Override - public boolean equals(Object o) { - if(this == o) { - return true; - } - if(o instanceof TypedEntity) { - final TypedEntity other = (TypedEntity) o; - return Objects.equals(subject, other.subject) && - Objects.equals(typeId, other.typeId) && - Objects.equals(optionalFields, other.optionalFields); - } - return false; - } - - /** - * @return An empty instance of {@link Builder}. - */ - public static Builder builder() { - return new Builder(); - } - - /** - * Makes a {@link Builder} that is populated with an existing {@link TypedEntity}. - * - * @param entity - The initial values of the builder. (not null) - * @return An instance of {@link Builder} loaded with {@code entity}'s values. - */ - public static Builder builder(TypedEntity entity) { - requireNonNull(entity); - - final Builder builder = builder() - .setId(entity.getSubject()) - .setTypeId(entity.getTypeId()); - - entity.getProperties().forEach(builder::setProperty); - - return builder; - } - - /** - * Builds instances of {@link TypedEntity}. - */ - @ParametersAreNonnullByDefault - public static class Builder { - - private RyaURI subject; - private RyaURI typeId; - private boolean explicitlyTyped = false; - private final Map<RyaURI, Property> properties = new HashMap<>(); - - /** - * @param subject - The Subject of the {@link Entity} this view was derived from. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setId(@Nullable final RyaURI subject) { - this.subject = subject; - return this; - } - - /** - * @param typeId - The ID of the {@link Type} that defines the structure of this Entity. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setTypeId(@Nullable final RyaURI typeId) { - this.typeId = typeId; - return this; - } - - /** - * @param explicitlyTyped - {@code true} if the Entity's Type has been explicitly - * set to the {@link #typeId} value; {@code false} if it is implicit (this Entity - * only exists because it has properties that happen to match that type's properties). - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setExplicitelyTyped(boolean explicitlyTyped) { - this.explicitlyTyped = explicitlyTyped; - return this; - } - - /** - * @param property - A {@link Property} of the {@link TypedEntity}. - * @return This {@link Builder} so that method invocations may be chained. - */ - public Builder setProperty(@Nullable final Property property) { - if(property != null) { - properties.put(property.getName(), property); - } - return this; - } - - /** - * @return An instance of {@link TypedEntity} built with this builder's values. - */ - public TypedEntity build() { - return new TypedEntity( - subject, - typeId, - explicitlyTyped, - ImmutableMap.copyOf(properties)); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/query/EntityQueryNode.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/query/EntityQueryNode.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/query/EntityQueryNode.java deleted file mode 100644 index 76e6146..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/query/EntityQueryNode.java +++ /dev/null @@ -1,238 +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. - */ -package mvm.rya.indexing.entity.query; - -import static java.util.Objects.requireNonNull; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Optional; - -import javax.annotation.ParametersAreNonnullByDefault; - -import org.openrdf.model.vocabulary.RDF; -import org.openrdf.query.BindingSet; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.Var; -import org.openrdf.query.algebra.evaluation.impl.ExternalSet; - -import com.google.common.collect.ImmutableMap; - -import info.aduna.iteration.CloseableIteration; -import mvm.rya.api.domain.RyaURI; -import mvm.rya.indexing.entity.model.Type; -import mvm.rya.indexing.entity.storage.EntityStorage; -import mvm.rya.rdftriplestore.evaluation.ExternalBatchingIterator; - -/** - * TODO impl, test, doc - */ -@ParametersAreNonnullByDefault -public class EntityQueryNode extends ExternalSet implements ExternalBatchingIterator { - - /** - * The RyaURI that when used as the Predicate of a Statement Pattern indicates the Type of the Entities. - */ - private static final RyaURI TYPE_ID_URI = new RyaURI(RDF.TYPE.toString()); - - // Provided at construction time. - private final Type type; - private final Collection<StatementPattern> patterns; - private final EntityStorage entities; - - // Information about the subject of the patterns. - private final boolean subjectIsConstant; - private final Optional<String> subjectConstant; - private final Optional<String> subjectVar; - - // Information about the objects of the patterns. - - // XXX what does this map? property name -> binding variable? - // for any property of the entity that has a variable, have to fill it in? - private final ImmutableMap<RyaURI, String> objectVariables; - - - /** - * Constructs an instance of {@link EntityQueryNode}. - * - * @param type - The type of {@link Entity} this node matches. (not null) - * @param patterns - The query StatementPatterns that are solved using an - * Entity of the Type. (not null) - * @param entities - The {@link EntityStorage} that will be searched to match - * {@link BindingSet}s when evaluating a query. (not null) - */ - public EntityQueryNode(final Type type, final Collection<StatementPattern> patterns, final EntityStorage entities) throws IllegalStateException { - this.type = requireNonNull(type); - this.patterns = requireNonNull(patterns); - this.entities = requireNonNull(entities); - - // Subject based preconditions. - verifySameSubjects(patterns); - - // Predicate based preconditions. - verifyAllPredicatesAreConstants(patterns); - verifyHasCorrectTypePattern(type, patterns); - verifyAllPredicatesPartOfType(type, patterns); - - // The Subject may either be constant or a variable. - final Var subject = patterns.iterator().next().getSubjectVar(); - subjectIsConstant = subject.isConstant(); - if(subjectIsConstant) { - subjectConstant = Optional.of( subject.getValue().toString() ); - subjectVar = Optional.empty(); - } else { - subjectConstant = Optional.empty(); - subjectVar = Optional.of( subject.getName() ); - } - - // TODO Also, map each variable that is in an Object spot each variable can be mapped to a property name as well - // Processing note: - // Any constant that appears in the Object portion of the SP will be used to make sure they match. - - objectVariables = null; - } - - /** - * Verify the Subject for all of the patterns is the same. - * - * @param patterns - The patterns to check. - * @throws IllegalStateException If all of the Subjects are not the same. - */ - private static void verifySameSubjects(Collection<StatementPattern> patterns) throws IllegalStateException { - requireNonNull(patterns); - - final Iterator<StatementPattern> it = patterns.iterator(); - final Var subject = it.next().getSubjectVar(); - - while(it.hasNext()) { - final StatementPattern pattern = it.next(); - if(!pattern.getSubjectVar().equals(subject)) { - throw new IllegalStateException("At least one of the patterns has a different subject from the others. " + - "All subjects must be the same."); - } - } - } - - /** - * Verifies all of the Statement Patterns have Constants for their predicates. - * - * @param patterns - The patterns to check. (not null) - * @throws IllegalStateException A pattern has a variable predicate. - */ - private static void verifyAllPredicatesAreConstants(Collection<StatementPattern> patterns) throws IllegalStateException { - requireNonNull(patterns); - - for(final StatementPattern pattern : patterns) { - if(!pattern.getPredicateVar().isConstant()) { - throw new IllegalStateException("The Predicate of a Statement Pattern must be constant. Pattern: " + pattern); - } - } - } - - /** - * Verifies a single Statement Pattern defines the Type of Entity this query node matches. - * - * @param type - The expected Type. (not null) - * @param patterns - The patterns to check. (not null) - * @throws IllegalStateException No Type or the wrong Type is specified by the patterns. - */ - private static void verifyHasCorrectTypePattern(Type type, Collection<StatementPattern> patterns) throws IllegalStateException { - requireNonNull(type); - requireNonNull(patterns); - - boolean typeFound = false; - - for(final StatementPattern pattern : patterns) { - final RyaURI predicate = new RyaURI(pattern.getPredicateVar().getValue().toString()); - - if(predicate.equals(TYPE_ID_URI)) { - final RyaURI typeId = new RyaURI( pattern.getObjectVar().getValue().stringValue() ); - if(typeId.equals(type.getId())) { - typeFound = true; - } else { - throw new IllegalStateException("Statement Pattern encountred for a Type that does not match the expected Type." + - " Expected Type = '" + type.getId().getData() + "' Found Type = '" + typeId.getData() + "'"); - } - } - } - - if(!typeFound) { - throw new IllegalStateException("The collection of Statement Patterns that this node matches must define which Type they match."); - } - } - - /** - * Verify all of the patterns have predicates that match one of the Type's property names. - * - * @param type - The Type the patterns match. (not null) - * @param patterns - The patterns to check. - * @throws IllegalStateException If any of the non-type defining Statement Patterns - * contain a predicate that does not match one of the Type's property names. - */ - private static void verifyAllPredicatesPartOfType(Type type, Collection<StatementPattern> patterns) throws IllegalStateException { - requireNonNull(type); - requireNonNull(patterns); - - for(final StatementPattern pattern : patterns) { - // Skip TYPE patterns. - final RyaURI predicate = new RyaURI( pattern.getPredicateVar().getValue().toString() ); - if(predicate.equals(TYPE_ID_URI)) { - continue; - } - - if(!type.getPropertyNames().contains(predicate)) { - throw new IllegalStateException("The Predicate of a Statement Pattern must be a property name for the Type. " + - "Type ID: '" + type.getId().getData() + "' Pattern: " + pattern); - } - } - } - - - - - - - @Override - public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(Collection<BindingSet> bindingSets) throws QueryEvaluationException { - // TODO Auto-generated method stub - return null; - } - - @Override - public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(BindingSet bindingSet) throws QueryEvaluationException { - requireNonNull(bindingSet); - - // ... ok, so if the subject needs to be filled in, then we need to see if the subject variable is in the binding set. - // if it is, fetch that value and then fetch the entity for the subject. - - // if it isn't, fetch the entity for the constant? - - - // RETURN AN EMPTY ITERATION IF IT CAN NOT FILL IT IN! - - // for all variables in the OBJECT portion of the SPs, fill 'em in using the entity that is stored in the index. - - // x = alice's SSN - // y = blue <-- how do i know this is for urn:eye property? FROM THE STATEMENT PATTERN. look for the ?y in the SP, and that has the property name in it. - - // TODO Auto-generated method stub - return null; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/CloseableIterator.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/CloseableIterator.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/CloseableIterator.java deleted file mode 100644 index ab7c7d8..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/CloseableIterator.java +++ /dev/null @@ -1,29 +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. - */ -package mvm.rya.indexing.entity.storage; - -import java.io.Closeable; -import java.util.Iterator; - -/** - * An {@link Iterator} that is also {@link Closeable}. - * - * @param <T> - The type of object that will be iterated over. - */ -public interface CloseableIterator<T> extends Iterator<T>, Closeable { } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/EntityStorage.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/EntityStorage.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/EntityStorage.java deleted file mode 100644 index 545beaa..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/EntityStorage.java +++ /dev/null @@ -1,153 +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. - */ -package mvm.rya.indexing.entity.storage; - -import java.util.Optional; -import java.util.Set; - -import javax.annotation.ParametersAreNonnullByDefault; - -import mvm.rya.api.domain.RyaURI; -import mvm.rya.indexing.entity.EntityIndexException; -import mvm.rya.indexing.entity.model.Entity; -import mvm.rya.indexing.entity.model.Property; -import mvm.rya.indexing.entity.model.Type; -import mvm.rya.indexing.entity.model.TypedEntity; - -/** - * Stores and provides access to {@link Entity}s. - */ -@ParametersAreNonnullByDefault -public interface EntityStorage { - - /** - * Creates a new {@link Entity} within the storage. The new Entity's subject must be unique. - * - * @param entity - The {@link Entity} to create. (not null) - * @throws EntityAlreadyExistsException An {@link Entity} could not be created because one already exists for the Subject. - * @throws EntityStorageException A problem occurred while creating the Entity. - */ - public void create(Entity entity) throws EntityAlreadyExistsException, EntityStorageException; - - /** - * Get an {@link Entity} from the storage by its subject. - * - * @param subject - Identifies which {@link Entity} to get. (not null) - * @return The {@link Entity} if one exists for the subject. - * @throws EntityStorageException A problem occurred while fetching the Entity from the storage. - */ - public Optional<Entity> get(RyaURI subject) throws EntityStorageException; - - /** - * Update the state of an {@link Entity}. - * - * @param old - The Entity the changes were applied to. (not null) - * @param updated - The updated Entity to store. (not null) - * @throws StaleUpdateException The {@code old} Entity does not match any Entities that are stored. - * @throws EntityStorageException A problem occurred while updating the Entity within the storage. - */ - public void update(Entity old, Entity updated) throws StaleUpdateException, EntityStorageException; - - /** - * Search the stored {@link Entity}s that have a specific {@link Type} as - * well as the provided {@link Property} values. - * - * @param type - The {@link Type} of the Entities. (not null) - * @param properties - The {@link Property} values that must be set on the Entity. (not null) - * @return A {@link CloseableIterator} over the {@link TypedEntity}s that match the search parameters. - * @throws EntityStorageException A problem occurred while searching the storage. - */ - public CloseableIterator<TypedEntity> search(Type type, Set<Property> properties) throws EntityStorageException; - - /** - * Deletes an {@link Entity} from the storage. - * - * @param subject -Identifies which {@link Entity} to delete. (not null) - * @return {@code true} if something was deleted; otherwise {@code false}. - * @throws EntityStorageException A problem occurred while deleting from the storage. - */ - public boolean delete(RyaURI subject) throws EntityStorageException; - - /** - * Indicates a problem while interacting with an {@link EntityStorage}. - */ - public static class EntityStorageException extends EntityIndexException { - private static final long serialVersionUID = 1L; - - /** - * Constructs a new exception with the specified detail message. The - * cause is not initialized, and may subsequently be initialized by - * a call to {@link #initCause}. - * - * @param message the detail message. The detail message is saved for - * later retrieval by the {@link #getMessage()} method. - */ - public EntityStorageException(String message) { - super(message); - } - - /** - * Constructs a new exception with the specified detail message and - * cause. <p>Note that the detail message associated with - * {@code cause} is <i>not</i> automatically incorporated in - * this exception's detail message. - * - * @param message the detail message (which is saved for later retrieval - * by the {@link #getMessage()} method). - * @param cause the cause (which is saved for later retrieval by the - * {@link #getCause()} method). (A <tt>null</tt> value is - * permitted, and indicates that the cause is nonexistent or - * unknown.) - */ - public EntityStorageException(String message, Throwable cause) { - super(message, cause); - } - } - - /** - * An {@link Entity} could not be created because one already exists for the Subject. - */ - public static class EntityAlreadyExistsException extends EntityStorageException { - private static final long serialVersionUID = 1L; - - public EntityAlreadyExistsException(String message) { - super(message); - } - - public EntityAlreadyExistsException(String message, Throwable cause) { - super(message, cause); - } - } - - /** - * An {@link TypedEntity} could not be updated because the old state does not - * match the current state. - */ - public static class StaleUpdateException extends EntityStorageException { - private static final long serialVersionUID = 1L; - - public StaleUpdateException(String message) { - super(message); - } - - public StaleUpdateException(String message, Throwable cause) { - super(message, cause); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/TypeStorage.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/TypeStorage.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/TypeStorage.java deleted file mode 100644 index 8d99001..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/TypeStorage.java +++ /dev/null @@ -1,106 +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. - */ -package mvm.rya.indexing.entity.storage; - -import javax.annotation.ParametersAreNonnullByDefault; - -import com.google.common.base.Optional; - -import mvm.rya.api.domain.RyaURI; -import mvm.rya.indexing.entity.EntityIndexException; -import mvm.rya.indexing.entity.model.Type; - -/** - * Stores and provides access to {@link Type}s. - */ -@ParametersAreNonnullByDefault -public interface TypeStorage { - - /** - * Creates a new {@link Type} within the storage. The new Type's ID must be unique. - * - * @param type - The {@link Type} to create. (not null) - * @throws TypeStorageException A problem occurred while creating the Type. - */ - public void create(Type type) throws TypeStorageException; - - /** - * Get a {@link Type} from the storage by its ID. - * - * @param typeId - The {@link Type}'s ID. (not null) - * @return The {@link Type} if one exists for the ID. - * @throws TypeStorageException A problem occurred while fetching from the storage. - */ - public Optional<Type> get(RyaURI typeId) throws TypeStorageException; - - /** - * Get all {@link Type}s that include a specific {@link Property} name. - * - * @param propertyName - The name to search for. (not null) - * @return All {@link Type}s that include {@code propertyName}. - * @throws TypeStorageException A problem occurred while searching for the Types - * that have the Property name. - */ - public CloseableIterator<Type> search(RyaURI propertyName) throws TypeStorageException; - - /** - * Deletes a {@link Type} from the storage. - * - * @param typeId - The ID of the {@link Type} to delete. (not null) - * @return {@code true} if something was deleted; otherwise {@code false}. - * @throws TypeStorageException A problem occurred while deleting from the storage. - */ - public boolean delete(RyaURI typeId) throws TypeStorageException; - - /** - * A problem occurred while interacting with a {@link TypeStorage}. - */ - public static class TypeStorageException extends EntityIndexException { - private static final long serialVersionUID = 1L; - - /** - * Constructs a new exception with the specified detail message. The - * cause is not initialized, and may subsequently be initialized by - * a call to {@link #initCause}. - * - * @param message the detail message. The detail message is saved for - * later retrieval by the {@link #getMessage()} method. - */ - public TypeStorageException(String message) { - super(message); - } - - /** - * Constructs a new exception with the specified detail message and - * cause. <p>Note that the detail message associated with - * {@code cause} is <i>not</i> automatically incorporated in - * this exception's detail message. - * - * @param message the detail message (which is saved for later retrieval - * by the {@link #getMessage()} method). - * @param cause the cause (which is saved for later retrieval by the - * {@link #getCause()} method). (A <tt>null</tt> value is - * permitted, and indicates that the cause is nonexistent or - * unknown.) - */ - public TypeStorageException(String message, Throwable cause) { - super(message, cause); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/ConvertingCursor.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/ConvertingCursor.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/ConvertingCursor.java deleted file mode 100644 index 0015d34..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/ConvertingCursor.java +++ /dev/null @@ -1,76 +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. - */ -package mvm.rya.indexing.entity.storage.mongo; - -import static java.util.Objects.requireNonNull; - -import java.io.IOException; -import java.util.function.Function; - -import org.bson.Document; - -import com.mongodb.client.MongoCursor; - -import mvm.rya.indexing.entity.storage.CloseableIterator; - -/** - * Converts the {@link Document}s that are returned by a {@link MongoCursor} - * using a {@link DocumentConverter} every time {@link #next()} is invoked. - * - * @param <T> - The type of object the Documents are converted into. - */ -public class ConvertingCursor<T> implements CloseableIterator<T> { - - private final Converter<T> converter; - private final MongoCursor<Document> cursor; - - /** - * Constructs an instance of {@link ConvertingCursor}. - * - * @param converter - Converts the {@link Document}s returned by {@code cursor}. (not null) - * @param cursor - Retrieves the {@link Document}s from a Mongo DB instance. (not null) - */ - public ConvertingCursor(Converter<T> converter, MongoCursor<Document> cursor) { - this.converter = requireNonNull(converter); - this.cursor = requireNonNull(cursor); - } - - @Override - public boolean hasNext() { - return cursor.hasNext(); - } - - @Override - public T next() { - return converter.apply( cursor.next() ); - } - - @Override - public void close() throws IOException { - cursor.close(); - } - - /** - * Converts a {@link Document} into some other object. - * - * @param <R> The type of object the Document is converted into. - */ - @FunctionalInterface - public static interface Converter<R> extends Function<Document, R> { } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/DocumentConverter.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/DocumentConverter.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/DocumentConverter.java deleted file mode 100644 index 05a3720..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/DocumentConverter.java +++ /dev/null @@ -1,65 +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. - */ -package mvm.rya.indexing.entity.storage.mongo; - -import javax.annotation.ParametersAreNonnullByDefault; - -import org.bson.Document; - -/** - * Converts an object to/from a {@link Document}. - * - * @param <T> - The type of object that is converted to/from a {@link Document}. - */ -@ParametersAreNonnullByDefault -public interface DocumentConverter<T> { - - /** - * Converts an object into a {@link Document}. - * - * @param object - The object to convert. (not null) - * @return A {@link Document} representing the object. - * @throws DocumentConverterException A problem occurred while converting the object. - */ - public Document toDocument(T object) throws DocumentConverterException; - - /** - * Converts a {@link Document} into the target object. - * - * @param document - The document to convert. (not null) - * @return The target object representation of the document. - * @throws DocumentConverterException A problem occurred while converting the {@link Document}. - */ - public T fromDocument(Document document) throws DocumentConverterException; - - /** - * A problem occurred while converting an object while using a {@link DocumentConverter}. - */ - public static class DocumentConverterException extends Exception { - private static final long serialVersionUID = 1L; - - public DocumentConverterException(String message) { - super(message); - } - - public DocumentConverterException(String message, Throwable cause) { - super(message, cause); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java deleted file mode 100644 index 0197fca..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java +++ /dev/null @@ -1,123 +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. - */ -package mvm.rya.indexing.entity.storage.mongo; - -import static java.util.Objects.requireNonNull; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.annotation.ParametersAreNonnullByDefault; - -import org.bson.Document; - -import mvm.rya.api.domain.RyaType; -import mvm.rya.api.domain.RyaURI; -import mvm.rya.indexing.entity.model.Entity; -import mvm.rya.indexing.entity.model.Property; - -/** - * Converts between {@link Entity} and {@link Document}. - */ -@ParametersAreNonnullByDefault -public class EntityDocumentConverter implements DocumentConverter<Entity> { - - public static final String SUBJECT = "_id"; - public static final String EXPLICIT_TYPE_IDS = "explicitTypeIds"; - public static final String PROPERTIES = "properties"; - public static final String VERSION = "version"; - - private final RyaTypeDocumentConverter ryaTypeConverter = new RyaTypeDocumentConverter(); - - @Override - public Document toDocument(Entity entity) { - requireNonNull(entity); - - final Document doc = new Document(); - doc.append(SUBJECT, entity.getSubject().getData()); - - doc.append(EXPLICIT_TYPE_IDS, entity.getExplicitTypeIds().stream() - .map(explicitTypeId -> explicitTypeId.getData()) - .collect(Collectors.toList())); - - final Document propertiesDoc = new Document(); - for(final RyaURI typeId : entity.getProperties().keySet()) { - final Document typePropertiesDoc = new Document(); - entity.getProperties().get(typeId) - .forEach((propertyNameUri, property) -> { - final String propertyName = property.getName().getData(); - final RyaType value = property.getValue(); - typePropertiesDoc.append(propertyName, ryaTypeConverter.toDocument(value)); - }); - propertiesDoc.append(typeId.getData(), typePropertiesDoc); - } - doc.append(PROPERTIES, propertiesDoc); - - doc.append(VERSION, entity.getVersion()); - - return doc; - } - - @Override - public Entity fromDocument(Document document) throws DocumentConverterException { - requireNonNull(document); - - // Preconditions. - if(!document.containsKey(SUBJECT)) { - throw new DocumentConverterException("Could not convert document '" + document + - "' because its '" + SUBJECT + "' field is missing."); - } - - if(!document.containsKey(EXPLICIT_TYPE_IDS)) { - throw new DocumentConverterException("Could not convert document '" + document + - "' because its '" + EXPLICIT_TYPE_IDS + "' field is missing."); - } - - if(!document.containsKey(PROPERTIES)) { - throw new DocumentConverterException("Could not convert document '" + document + - "' because its '" + PROPERTIES + "' field is missing."); - } - - if(!document.containsKey(VERSION)) { - throw new DocumentConverterException("Could not convert document '" + document + - "' because its '" + VERSION + "' field is missing."); - } - - // Perform the conversion. - final Entity.Builder builder = Entity.builder() - .setSubject( new RyaURI(document.getString(SUBJECT)) ); - - ((List<String>)document.get(EXPLICIT_TYPE_IDS)).stream() - .forEach(explicitTypeId -> builder.setExplicitType(new RyaURI(explicitTypeId))); - - final Document propertiesDoc = (Document) document.get(PROPERTIES); - for(final String typeId : propertiesDoc.keySet()) { - final Document typePropertiesDoc = (Document) propertiesDoc.get(typeId); - for(final String propertyName : typePropertiesDoc.keySet()) { - final Document value = (Document) typePropertiesDoc.get(propertyName); - final RyaType propertyValue = ryaTypeConverter.fromDocument( value ); - builder.setProperty(new RyaURI(typeId), new Property(new RyaURI(propertyName), propertyValue)); - } - } - - builder.setVersion( document.getInteger(VERSION) ); - - return builder.build(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/07643eb7/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/MongoEntityStorage.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/MongoEntityStorage.java b/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/MongoEntityStorage.java deleted file mode 100644 index 33ac03b..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/entity/storage/mongo/MongoEntityStorage.java +++ /dev/null @@ -1,244 +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. - */ -package mvm.rya.indexing.entity.storage.mongo; - -import static java.util.Objects.requireNonNull; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.ParametersAreNonnullByDefault; - -import org.bson.Document; -import org.bson.conversions.Bson; - -import com.google.common.base.Joiner; -import com.mongodb.ErrorCategory; -import com.mongodb.MongoClient; -import com.mongodb.MongoException; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.model.Filters; - -import mvm.rya.api.domain.RyaURI; -import mvm.rya.indexing.entity.model.Entity; -import mvm.rya.indexing.entity.model.Property; -import mvm.rya.indexing.entity.model.Type; -import mvm.rya.indexing.entity.model.TypedEntity; -import mvm.rya.indexing.entity.storage.CloseableIterator; -import mvm.rya.indexing.entity.storage.EntityStorage; -import mvm.rya.indexing.entity.storage.mongo.ConvertingCursor.Converter; -import mvm.rya.indexing.entity.storage.mongo.DocumentConverter.DocumentConverterException; - -/** - * A Mongo DB implementation of {@link EntityStorage}. - */ -@ParametersAreNonnullByDefault -public class MongoEntityStorage implements EntityStorage { - - private static final String COLLECTION_NAME = "entity-entities"; - - private static final EntityDocumentConverter ENTITY_CONVERTER = new EntityDocumentConverter(); - - /** - * A client connected to the Mongo instance that hosts the Rya instance. - */ - private final MongoClient mongo; - - /** - * The name of the Rya instance the {@link TypedEntity}s are for. - */ - private final String ryaInstanceName; - - /** - * Constructs an instance of {@link MongoEntityStorage}. - * - * @param mongo - A client connected to the Mongo instance that hosts the Rya instance. (not null) - * @param ryaInstanceName - The name of the Rya instance the {@link TypedEntity}s are for. (not null) - */ - public MongoEntityStorage(MongoClient mongo, String ryaInstanceName) { - this.mongo = requireNonNull(mongo); - this.ryaInstanceName = requireNonNull(ryaInstanceName); - } - - @Override - public void create(Entity entity) throws EntityStorageException { - requireNonNull(entity); - - try { - mongo.getDatabase(ryaInstanceName) - .getCollection(COLLECTION_NAME) - .insertOne( ENTITY_CONVERTER.toDocument(entity) ); - - } catch(final MongoException e) { - final ErrorCategory category = ErrorCategory.fromErrorCode( e.getCode() ); - if(category == ErrorCategory.DUPLICATE_KEY) { - throw new EntityAlreadyExistsException("Failed to create Entity with Subject '" + entity.getSubject().getData() + "'.", e); - } - throw new EntityStorageException("Failed to create Entity with Subject '" + entity.getSubject().getData() + "'.", e); - } - } - - @Override - public void update(Entity old, Entity updated) throws StaleUpdateException, EntityStorageException { - requireNonNull(old); - requireNonNull(updated); - - // The updated entity must have the same Subject as the one it is replacing. - if(!old.getSubject().equals(updated.getSubject())) { - throw new EntityStorageException("The old Entity and the updated Entity must have the same Subject. " + - "Old Subject: " + old.getSubject().getData() + ", Updated Subject: " + updated.getSubject().getData()); - } - - // Make sure the updated Entity has a higher verison. - if(old.getVersion() >= updated.getVersion()) { - throw new EntityStorageException("The old Entity's version must be less than the updated Entity's version." + - " Old version: " + old.getVersion() + " Updated version: " + updated.getVersion()); - } - - final Set<Bson> filters = new HashSet<>(); - - // Must match the old entity's Subject. - filters.add( makeSubjectFilter(old.getSubject()) ); - - // Must match the old entity's Version. - filters.add( makeVersionFilter(old.getVersion()) ); - - // Do a find and replace. - final Bson oldEntityFilter = Filters.and(filters); - final Document updatedDoc = ENTITY_CONVERTER.toDocument(updated); - - final MongoCollection<Document> collection = mongo.getDatabase(ryaInstanceName).getCollection(COLLECTION_NAME); - if(collection.findOneAndReplace(oldEntityFilter, updatedDoc) == null) { - throw new StaleUpdateException("Could not update the Entity with Subject '" + updated.getSubject().getData() + "."); - } - } - - @Override - public Optional<Entity> get(RyaURI subject) throws EntityStorageException { - requireNonNull(subject); - - try { - final Document document = mongo.getDatabase(ryaInstanceName) - .getCollection(COLLECTION_NAME) - .find( Filters.eq(EntityDocumentConverter.SUBJECT, subject.getData()) ) - .first(); - - return document == null ? - Optional.empty() : - Optional.of( ENTITY_CONVERTER.fromDocument(document) ); - - } catch(final MongoException | DocumentConverterException e) { - throw new EntityStorageException("Could not get the Entity with Subject '" + subject.getData() + "'.", e); - } - } - - @Override - public CloseableIterator<TypedEntity> search(final Type type, final Set<Property> properties) throws EntityStorageException { - requireNonNull(type); - requireNonNull(properties); - - try { - // Match the specified Property values. - final Set<Bson> filters = properties.stream() - .flatMap(property -> makePropertyFilters(type.getId(), property)) - .collect(Collectors.toSet()); - - // Only match explicitly Typed entities. - filters.add( makeExplicitTypeFilter(type.getId()) ); - - // Get a cursor over the Mongo Document that represent the search results. - final MongoCursor<Document> cursor = mongo.getDatabase(ryaInstanceName) - .getCollection(COLLECTION_NAME) - .find(Filters.and(filters)) - .iterator(); - - // Define that Converter that converts from Document into TypedEntity. - final Converter<TypedEntity> converter = document -> { - try { - final Entity entity = ENTITY_CONVERTER.fromDocument(document); - final Optional<TypedEntity> typedEntity = entity.makeTypedEntity( type.getId() ); - if(!typedEntity.isPresent()) { - throw new RuntimeException("Entity with Subject '" + entity.getSubject() + - "' could not be cast into Type '" + type.getId() + "'."); - } - return typedEntity.get(); - - } catch (final DocumentConverterException e) { - throw new RuntimeException("Document '" + document + "' could not be parsed into an Entity.", e); - } - }; - - // Return a cursor that performs the conversion. - return new ConvertingCursor<TypedEntity>(converter, cursor); - - } catch(final MongoException e) { - throw new EntityStorageException("Could not search Entity.", e); - } - } - - @Override - public boolean delete(RyaURI subject) throws EntityStorageException { - requireNonNull(subject); - - try { - final Document deleted = mongo.getDatabase(ryaInstanceName) - .getCollection(COLLECTION_NAME) - .findOneAndDelete( makeSubjectFilter(subject) ); - - return deleted != null; - - } catch(final MongoException e) { - throw new EntityStorageException("Could not delete the Entity with Subject '" + subject.getData() + "'.", e); - } - } - - private static Bson makeSubjectFilter(RyaURI subject) { - return Filters.eq(EntityDocumentConverter.SUBJECT, subject.getData()); - } - - private static Bson makeVersionFilter(int version) { - return Filters.eq(EntityDocumentConverter.VERSION, version); - } - - private static Bson makeExplicitTypeFilter(RyaURI typeId) { - return Filters.eq(EntityDocumentConverter.EXPLICIT_TYPE_IDS, typeId.getData()); - } - - private static Stream<Bson> makePropertyFilters(RyaURI typeId, Property property) { - final String propertyName = property.getName().getData(); - - // Must match the property's data type. - final String dataTypePath = Joiner.on(".").join( - new String[]{EntityDocumentConverter.PROPERTIES, typeId.getData(), propertyName, RyaTypeDocumentConverter.DATA_TYPE}); - final String propertyDataType = property.getValue().getDataType().stringValue(); - final Bson dataTypeFilter = Filters.eq(dataTypePath, propertyDataType); - - // Must match the property's value. - final String valuePath = Joiner.on(".").join( - new String[]{EntityDocumentConverter.PROPERTIES, typeId.getData(), propertyName, RyaTypeDocumentConverter.VALUE}); - final String propertyValue = property.getValue().getData(); - final Bson valueFilter = Filters.eq(valuePath, propertyValue); - - return Stream.of(dataTypeFilter, valueFilter); - } -} \ No newline at end of file
