14 March 2024

XAP

Collection Index

An index can be defined on a Collection property (java.util.Collection implementation) or Array. Setting such an index means that each of the Collection's or Array's items is indexed. Setting an index on a Collection / Array done using the SpaceIndex.path() attribute where a Collection / Array property should be followed by "[*]".

You cannot use a SQL function in combination with the collection index; you will get no results.

The following example shows how to define an index on a List of Integers:

@SpaceClass public class CollectionIndexingExample { private Integer id; private List<Integer> numbers; // Getter and setter methods... @SpaceIndex(path="[*]") // This means that each Integer in the List is indexed. public List<Integer> getNumbers() { return this.numbers; } }

The following query shows how to use the index:

SQLQuery<CollectionIndexingExample> sqlQuery = new SQLQuery<CollectionIndexingExample>( CollectionIndexingExample.class, "numbers[*] = 30"); CollectionIndexingExample[] result = gigaspace.readMultiple(sqlQuery);

See the Free Text Search page for more details.

Nested Property Within a Collection

Its also possible to index a nested property within a collection.

The following example shows how to define an index on Book.id property which resides in a Collection property in Author:

@SpaceClass public class Author { private String name; private Collection<Book> books; // Getter and setter methods... @SpaceIndex(path="[*].id") // This means that each Book.id in the Collection is indexed. public Collection<Book> getBooks() { return this.books; } } public class Book { private Integer id; private String name; // Getter and setter methods... public Integer getId() { return this.id; } }

The following query shows how to take advantage of the defined index:

SQLQuery<Author> sqlQuery = new SQLQuery<Author>(Author.class, "books[*].id = 57"); Author result = gigaspace.read(sqlQuery);

Setting an index on a Collection within a nested property is also accepted:

@SpaceClass public class Employee { private Long id; private Information information; // Getter and setter methods... @SpaceIndex(path="phoneNumbers[*]") public Information getInformation() { return this.information; } } public class Information { private Address address; private List<String> phoneNumbers; // Getter and setter methods... public List<String> getPhoneNumbers() { return this.phoneNumbers; } }

@SpaceIndex(type=SpaceIndexType.EQUAL), @SpaceIndex(type=SpaceIndexType.ORDERED), and @SpaceIndex(type=SpaceIndexType.EQUAL_AND_ORDERED) are supported.