You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dm...@apache.org on 2017/03/17 00:20:27 UTC

[19/19] ignite git commit: IGNITE-1192: finished general key-value store implementation

IGNITE-1192: finished general key-value store implementation


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b80b1a7b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b80b1a7b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b80b1a7b

Branch: refs/heads/ignite-1192
Commit: b80b1a7b45340d31f4360967e66da5e9fac8c7ee
Parents: cf27e54
Author: Denis Magda <dm...@gridgain.com>
Authored: Thu Mar 16 17:19:59 2017 -0700
Committer: Denis Magda <dm...@gridgain.com>
Committed: Thu Mar 16 17:19:59 2017 -0700

----------------------------------------------------------------------
 .../springdata/IgniteKeyValueAdapter.java       |  56 +++++++-
 .../config/EnableIgniteRepositories.java        | 136 +++++++++++++++++++
 .../config/IgniteRepositoriesRegistar.java      |  36 +++++
 .../IgniteRepositoryConfigurationExtension.java |  40 ++++++
 4 files changed, 261 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b80b1a7b/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java
index 5dbb286..bd299a9 100644
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java
@@ -18,8 +18,10 @@
 package org.apache.ignite.springdata;
 
 import java.io.Serializable;
-import java.util.Collection;
+import java.util.AbstractMap;
+import java.util.Iterator;
 import java.util.Map;
+import javax.cache.Cache;
 import javax.cache.processor.EntryProcessor;
 import javax.cache.processor.EntryProcessorException;
 import javax.cache.processor.MutableEntry;
@@ -27,10 +29,8 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.cache.CachePeekMode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.springframework.data.keyvalue.core.AbstractKeyValueAdapter;
-import org.springframework.data.keyvalue.core.ForwardingCloseableIterator;
 import org.springframework.data.util.CloseableIterator;
 
 /**
@@ -99,17 +99,59 @@ public class IgniteKeyValueAdapter extends AbstractKeyValueAdapter {
 
     /** {@inheritDoc} */
     @Override public Object delete(Serializable id, Serializable keyspace) {
-        return cache(keyspace).invoke(id, new RemovalEntryProcessor());
+        return cache(keyspace).invoke(id, new RemoveEntryProcessor());
     }
 
     /** {@inheritDoc} */
     @Override public Iterable<?> getAllOf(Serializable keyspace) {
-        return cache(keyspace).;
+        return new Iterable<Object>() {
+            @Override public Iterator<Object> iterator() {
+                return new CloseableIterator<Object>() {
+                    Iterator<Cache.Entry<Serializable, Object>> iter = cache(keyspace).iterator();
+
+                    @Override public boolean hasNext() {
+                        return iter.hasNext();
+                    }
+
+                    @Override public Object next() {
+                        Cache.Entry<Serializable, Object> entry = iter.next();
+
+                        assert entry != null;
+
+                        return entry.getValue();
+                    }
+
+                    @Override public void close() {
+                        // Ignite's internal iterator is referenced by a weak reference. Releasing it.
+                        iter = null;
+                    }
+                };
+            }
+        };
     }
 
     /** {@inheritDoc} */
     @Override public CloseableIterator<Map.Entry<Serializable, Object>> entries(Serializable keyspace) {
-        return new ForwardingCloseableIterator<Map.Entry<Serializable, Object>>(cache(keyspace).iterator());
+        return new CloseableIterator<Map.Entry<Serializable, Object>>() {
+            Iterator<Cache.Entry<Serializable, Object>> iter = cache(keyspace).iterator();
+
+            @Override public boolean hasNext() {
+                return iter.hasNext();
+            }
+
+            @Override public Map.Entry<Serializable, Object> next() {
+                Cache.Entry<Serializable, Object> entry = iter.next();
+
+                assert entry != null;
+
+                return new AbstractMap.SimpleEntry<Serializable, Object>(entry.getKey(), entry.getValue());
+            }
+
+            @Override public void close() {
+                // Ignite's internal iterator is referenced by a weak reference. Releasing it.
+                iter = null;
+            }
+        };
     }
 
     /** {@inheritDoc} */
@@ -149,7 +191,7 @@ public class IgniteKeyValueAdapter extends AbstractKeyValueAdapter {
     /**
      *
      */
-    private static class RemovalEntryProcessor implements EntryProcessor<Serializable, Object, Object> {
+    private static class RemoveEntryProcessor implements EntryProcessor<Serializable, Object, Object> {
         /** {@inheritDoc} */
         @Override public Object process(MutableEntry<Serializable, Object> entry, Object... arguments)
             throws EntryProcessorException {

http://git-wip-us.apache.org/repos/asf/ignite/blob/b80b1a7b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java
new file mode 100644
index 0000000..0705e88
--- /dev/null
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.springdata.repository.config;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.keyvalue.core.KeyValueOperations;
+import org.springframework.data.keyvalue.core.KeyValueTemplate;
+import org.springframework.data.keyvalue.repository.config.QueryCreatorType;
+import org.springframework.data.keyvalue.repository.query.CachingKeyValuePartTreeQuery;
+import org.springframework.data.keyvalue.repository.query.SpelQueryCreator;
+import org.springframework.data.keyvalue.repository.support.KeyValueRepositoryFactoryBean;
+import org.springframework.data.repository.config.DefaultRepositoryBaseClass;
+import org.springframework.data.repository.query.QueryLookupStrategy;
+import org.springframework.data.repository.query.QueryLookupStrategy.Key;
+
+/**
+ * Annotation to activate Apache Ignite repositories. If no base package is configured through either {@link #value()},
+ * {@link #basePackages()} or {@link #basePackageClasses()} it will trigger scanning of the package of annotated class.
+ *
+ * TODO: replace QueryCreatorType with Ignite version of the querying engine.
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@Import(IgniteRepositoriesRegistar.class)
+@QueryCreatorType(value = SpelQueryCreator.class, repositoryQueryType = CachingKeyValuePartTreeQuery.class)
+public @interface EnableIgniteRepositories {
+    /**
+     * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation declarations e.g.:
+     * {@code @EnableIgniteRepositories("org.my.pkg")} instead of
+     * {@code @EnableIgniteRepositories(basePackages="org.my.pkg")}.
+     */
+    String[] value() default {};
+
+    /**
+     * Base packages to scan for annotated components. {@link #value()} is an alias for (and mutually exclusive with)
+     * this attribute. Use {@link #basePackageClasses()} for a type-safe alternative to String-based package names.
+     */
+    String[] basePackages() default {};
+
+    /**
+     * Type-safe alternative to {@link #basePackages()} for specifying the packages to scan for annotated components.
+     * The package of each class specified will be scanned. Consider creating a special no-op marker class or interface
+     * in each package that serves no purpose other than being referenced by this attribute.
+     */
+    Class<?>[] basePackageClasses() default {};
+
+    /**
+     * Specifies which types are not eligible for component scanning.
+     */
+    Filter[] excludeFilters() default {};
+
+    /**
+     * Specifies which types are eligible for component scanning. Further narrows the set of candidate components from
+     * everything in {@link #basePackages()} to everything in the base packages that matches the given filter or
+     * filters.
+     */
+    Filter[] includeFilters() default {};
+
+    /**
+     * Returns the postfix to be used when looking up custom repository implementations. Defaults to {@literal Impl}. So
+     * for a repository named {@code PersonRepository} the corresponding implementation class will be looked up scanning
+     * for {@code PersonRepositoryImpl}.
+     *
+     * @return
+     */
+    String repositoryImplementationPostfix() default "Impl";
+
+    /**
+     * Configures the location of where to find the Spring Data named queries properties file.
+     *
+     * @return
+     */
+    String namedQueriesLocation() default "";
+
+    /**
+     * Returns the key of the {@link QueryLookupStrategy} to be used for lookup queries for query methods. Defaults to
+     * {@link Key#CREATE_IF_NOT_FOUND}.
+     *
+     * @return
+     */
+    Key queryLookupStrategy() default Key.CREATE_IF_NOT_FOUND;
+
+    /**
+     * TODO: replace with Ignite factory bean.
+     * Returns the {@link FactoryBean} class to be used for each repository instance. Defaults to
+     * {@link KeyValueRepositoryFactoryBean}.
+     *
+     * @return
+     */
+    Class<?> repositoryFactoryBeanClass() default KeyValueRepositoryFactoryBean.class;
+
+    /**
+     * Configure the repository base class to be used to create repository proxies for this particular configuration.
+     *
+     * @return
+     */
+    Class<?> repositoryBaseClass() default DefaultRepositoryBaseClass.class;
+
+    /**
+     * Configures the name of the {@link KeyValueOperations} bean to be used with the repositories detected.
+     *
+     * @return
+     */
+    String keyValueTemplateRef() default "igniteKeyValueTemplate";
+
+    /**
+     * Configures whether nested repository-interfaces (e.g. defined as inner classes) should be discovered by the
+     * repositories infrastructure.
+     */
+    boolean considerNestedRepositories() default false;
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b80b1a7b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoriesRegistar.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoriesRegistar.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoriesRegistar.java
new file mode 100644
index 0000000..0f65c32
--- /dev/null
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoriesRegistar.java
@@ -0,0 +1,36 @@
+/*
+ * 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.ignite.springdata.repository.config;
+
+import java.lang.annotation.Annotation;
+import org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupport;
+import org.springframework.data.repository.config.RepositoryConfigurationExtension;
+
+/**
+ * Apache Ignite specific implementation of {@link RepositoryBeanDefinitionRegistrarSupport}.
+ */
+public class IgniteRepositoriesRegistar extends RepositoryBeanDefinitionRegistrarSupport {
+    /** {@inheritDoc} */
+    @Override protected Class<? extends Annotation> getAnnotation() {
+        return EnableIgniteRepositories.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected RepositoryConfigurationExtension getExtension() {
+        return new IgniteRepositoryConfigurationExtension();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b80b1a7b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java
new file mode 100644
index 0000000..30f9385
--- /dev/null
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java
@@ -0,0 +1,40 @@
+/*
+ * 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.ignite.springdata.repository.config;
+
+import org.springframework.data.keyvalue.repository.config.KeyValueRepositoryConfigurationExtension;
+import org.springframework.data.repository.config.RepositoryConfigurationExtension;
+
+/**
+ * Apache Ignite specific implementation of {@link RepositoryConfigurationExtension}.
+ */
+public class IgniteRepositoryConfigurationExtension extends KeyValueRepositoryConfigurationExtension {
+    /** {@inheritDoc} */
+    @Override public String getModuleName() {
+        return "Apache Ignite";
+    }
+
+    /** {@inheritDoc} */
+    @Override protected String getModulePrefix() {
+        return "ignite";
+    }
+
+    /** {@inheritDoc} */
+    @Override protected String getDefaultKeyValueTemplateRef() {
+        return "igniteKeyValueTemplate";
+    }
+}