Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for GEOSHAPE index fields and WITHIN and CONTAINS query operators #2614

Open
uglide opened this issue Sep 18, 2023 · 4 comments
Open
Labels

Comments

@uglide
Copy link
Contributor

uglide commented Sep 18, 2023

Motivation

Since RediSearch 2.8, it's possible to do more advanced GEO querying with GEOSHAPE fields.

On the client side, we should provide support for Index creation and Querying. APIs should allow users to use popular WKT libraries that parse and "serialise" to WKT format (e.g. https://github.com/cschwarz/wkx)

Requirements:

  • Add support for GEOSHAPE fields:
    • Perform validations to allow passing only POLYGON and POINT geometry primitives.
    • Support specifying the coordinate system
  • Ensure that querying API is compatible with GEOSHAPE queries

Basic Code Example

// Geometry primitives will be used from third-party libraries and serialized to WKT
let p = new wkx.Polygon([new wkx.Point(1, 2), new wkx.Point(3, 4), new wkx.Point(5, 6), new wkx.Point(1, 2)]);

await client.hSet('land:123', {
    geometry: p.toWkt(), // Serialisation
    price: 29000
})

await client.ft.create('idx:land', {
    'geometry': {
        type: SchemaFieldTypes.GEOSHAPE // New field type
        COORD_SYSTEM: GeoshapeFieldCoordSystem.FLAT // Coordinate system type 
    },
    'price': {
        type: SchemaFieldTypes.NUMERIC,
    }
}, {
    ON: 'HASH',
    PREFIX: 'land:'
});

let areaOfInterest = new wkx.Polygon([new wkx.Point(1, 2), new wkx.Point(3, 4), new wkx.Point(5, 6), new wkx.Point(1, 2)]);

let result = await client.ft.search(
    'idx:land',
    '@geometry:[WITHIN $area] @price:[20000 30000]',
    {
        PARAMS: {
            area: areaOfInterest.toWkt()
        }
    }
);
@leibale leibale mentioned this issue Sep 18, 2023
leibale added a commit to leibale/node-redis that referenced this issue Sep 18, 2023
@leibale
Copy link
Collaborator

leibale commented Sep 18, 2023

3fa54fe

  • Add support for GEOSHAPE fields:
    • Perform validations to allow passing only POLYGON and POINT geometry primitives.
      Why? The server should handle this (he already does?), there is no reason to validate twice..
    • Support specifying the coordinate system
  • Ensure that querying API is compatible with GEOSHAPE queries

@chayim
Copy link
Contributor

chayim commented Sep 20, 2023

@leibale what's the norm here? The problem is (honestly) in some clients we half do this (randomly validating) and yet don't take it all the way through. Definitely open to not doing this, if it currently goes against lib norm.

@leibale
Copy link
Collaborator

leibale commented Sep 20, 2023

@chayim unless I have to, I let the server do its job... same for default values for arguments..

@simonprickett
Copy link
Contributor

Will this make it into a Node-Redis 4 release?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants