Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
DATAREDIS-533 - Add support for geo indexes.
We now allow usage of @GeoIndexed to mark GeoLocation or Point properties as candidates for secondary index creation. Non null values will be included in GEOADD command as follows: GEOADD keyspace:property-path point.x point.y entity-id @GeoIndexed can be used on top level as well as on nested properties. class Person { @id String id; String firstname, lastname; Address hometown; } class Address { String city, street, housenumber; @GeoIndexed Point location; } The above allows us to derive geospatial queries from a given method using NEAR and WITHIN keywords like: interface PersonRepository extends CrudRepository<Person, String> { List<Person> findByAddressLocationNear(Point point, Distance distance); List<Person> findByAddressLocationWithin(Circle circle); } Partial updates on the Point itself also trigger an index refresh operation. So it is possible to alter existing entities via: template.save(new PartialUpdate<Person>("1", Person.class).set("address.location", new Point(17, 18)); Original pull request: #215.
- Loading branch information
1 parent
5d09272
commit 07d0b82
Showing
21 changed files
with
930 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
src/main/java/org/springframework/data/redis/core/convert/GeoIndexedPropertyValue.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* Copyright 2016 the original author or authors. | ||
* | ||
* Licensed 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.springframework.data.redis.core.convert; | ||
|
||
import org.springframework.data.geo.Point; | ||
|
||
import lombok.Data; | ||
|
||
/** | ||
* {@link IndexedData} implementation indicating storage of data within a Redis GEO structure. | ||
* | ||
* @author Christoph Strobl | ||
* @since 1.8 | ||
*/ | ||
@Data | ||
public class GeoIndexedPropertyValue implements IndexedData { | ||
|
||
private final String keyspace; | ||
private final String indexName; | ||
private final Point value; | ||
|
||
/* | ||
* (non-Javadoc) | ||
* @see org.springframework.data.redis.core.convert.IndexedData#getIndexName() | ||
*/ | ||
@Override | ||
public String getIndexName() { | ||
return GeoIndexedPropertyValue.geoIndexName(indexName); | ||
} | ||
|
||
/* | ||
* (non-Javadoc) | ||
* @see org.springframework.data.redis.core.convert.IndexedData#getKeyspace() | ||
*/ | ||
@Override | ||
public String getKeyspace() { | ||
return keyspace; | ||
} | ||
|
||
public Point getPoint() { | ||
return value; | ||
} | ||
|
||
public static String geoIndexName(String path) { | ||
|
||
int index = path.lastIndexOf('.'); | ||
if (index == -1) { | ||
return path; | ||
} | ||
StringBuilder sb = new StringBuilder(path); | ||
sb.setCharAt(index, ':'); | ||
return sb.toString(); | ||
} | ||
} |
Oops, something went wrong.