HomeJsonExample.java

// EXAMPLE: java_home_json
// REMOVE_START
package io.redis.examples;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
// REMOVE_END
// STEP_START import
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.aggr.*;
import redis.clients.jedis.search.schemafields.*;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
// STEP_END

// HIDE_START
public class HomeJsonExample {

    @Test
    public void run() {
// HIDE_END
        // STEP_START connect
        UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
        // STEP_END

        //REMOVE_START
        // Clear the indexes and keys here before using them in tests.
        try {jedis.ftDropIndex("idx:users");} catch (JedisDataException j){}
        try {jedis.ftDropIndex("hash-idx:users");} catch (JedisDataException j){}
        jedis.del("user:1", "user:2", "user:3", "huser:1", "huser:2", "huser:3");
        //REMOVE_END

        // STEP_START create_data
        JSONObject user1 = new JSONObject()
                .put("name", "Paul John")
                .put("email", "paul.john@example.com")
                .put("age", 42)
                .put("city", "London");
        
        JSONObject user2 = new JSONObject()
                .put("name", "Eden Zamir")
                .put("email", "eden.zamir@example.com")
                .put("age", 29)
                .put("city", "Tel Aviv");
        
        JSONObject user3 = new JSONObject()
                .put("name", "Paul Zamir")
                .put("email", "paul.zamir@example.com")
                .put("age", 35)
                .put("city", "Tel Aviv");
        // STEP_END

        // STEP_START make_index
        SchemaField[] schema = {
            TextField.of("$.name").as("name"),
            TextField.of("$.city").as("city"),
            NumericField.of("$.age").as("age")
        };

        String createResult = jedis.ftCreate("idx:users",
            FTCreateParams.createParams()
                .on(IndexDataType.JSON)
                .addPrefix("user:"),
                schema
        );

        System.out.println(createResult); // >>> OK
        // STEP_END
        // REMOVE_START
        assertEquals("OK", createResult);
        // REMOVE_END

        // STEP_START add_data
        String user1Set = jedis.jsonSet("user:1", new Path2("$"), user1);
        String user2Set = jedis.jsonSet("user:2", new Path2("$"), user2);
        String user3Set = jedis.jsonSet("user:3", new Path2("$"), user3);
        // STEP_END
        // REMOVE_START
        assertEquals("OK", user1Set);
        assertEquals("OK", user2Set);
        assertEquals("OK", user3Set);
        // REMOVE_END

        // STEP_START query1
        SearchResult findPaulResult = jedis.ftSearch("idx:users",
             "Paul @age:[30 40]"
        );
        
        System.out.println(findPaulResult.getTotalResults()); // >>> 1

        List<Document> paulDocs = findPaulResult.getDocuments();

        for (Document doc: paulDocs) {
            System.out.println(doc.getId());
        }
        // >>> user:3
        // STEP_END
        // REMOVE_START
        assertEquals("user:3", paulDocs.get(0).getId());
        // REMOVE_END

        // STEP_START query2
        SearchResult citiesResult = jedis.ftSearch("idx:users",
            "Paul",
            FTSearchParams.searchParams()
                .returnFields("city")
        );

        System.out.println(citiesResult.getTotalResults()); // >>> 2

        for (Document doc: citiesResult.getDocuments()) {
            System.out.println(doc.getId());
        }
        // >>> user:1
        // >>> user:3
        // STEP_END
        // REMOVE_START
        assertArrayEquals(
            new String[] {"user:1", "user:3"},
            citiesResult.getDocuments().stream().map(Document::getId).sorted().toArray()
        );
        // REMOVE_END

        // STEP_START query3
        AggregationResult aggResult = jedis.ftAggregate("idx:users",
            new AggregationBuilder("*")
                .groupBy("@city", Reducers.count().as("count"))
        );

        System.out.println(aggResult.getTotalResults()); // >>> 2

        for (Row cityRow: aggResult.getRows()) {
            System.out.printf("%s - %d%n",
                cityRow.getString("city"), cityRow.getLong("count"));
        }
        // >>> London - 1
        // >>> Tel Aviv - 2
        // STEP_END
        // REMOVE_START
        assertArrayEquals(
            new String[] {"London - 1", "Tel Aviv - 2"},
            aggResult.getRows().stream()
                    .map(r -> r.getString("city") + " - " + r.getString("count"))
                    .sorted().toArray());
        // REMOVE_END

        // STEP_START make_hash_index
        SchemaField[] hashSchema = {
            TextField.of("name"),
            TextField.of("city"),
            NumericField.of("age")
        };

        String hashCreateResult = jedis.ftCreate("hash-idx:users",
            FTCreateParams.createParams()
                .on(IndexDataType.HASH)
                .addPrefix("huser:"),
                hashSchema
        );

        System.out.println(hashCreateResult); // >>> OK
        // STEP_END
        // REMOVE_START
        assertEquals("OK", hashCreateResult);
        // REMOVE_END

        // STEP_START add_hash_data
        Map<String, String> user1Info = new HashMap<>();
        user1Info.put("name", "Paul John");
        user1Info.put("email", "paul.john@example.com");
        user1Info.put("age", "42");
        user1Info.put("city", "London");
        long huser1Set = jedis.hset("huser:1", user1Info);
        
        System.out.println(huser1Set); // >>> 4

        Map<String, String> user2Info = new HashMap<>();
        user2Info.put("name", "Eden Zamir");
        user2Info.put("email", "eden.zamir@example.com");
        user2Info.put("age", "29");
        user2Info.put("city", "Tel Aviv");
        long huser2Set = jedis.hset("huser:2", user2Info);
        
        System.out.println(huser2Set); // >>> 4

        Map<String, String> user3Info = new HashMap<>();
        user3Info.put("name", "Paul Zamir");
        user3Info.put("email", "paul.zamir@example.com");
        user3Info.put("age", "35");
        user3Info.put("city", "Tel Aviv");
        long huser3Set = jedis.hset("huser:3", user3Info);
        
        System.out.println(huser3Set); // >>> 4
        // STEP_END
        // REMOVE_START
        assertEquals(4, huser1Set);
        assertEquals(4, huser2Set);
        assertEquals(4, huser3Set);
        // REMOVE_END
        
        // STEP_START query1_hash
        SearchResult findPaulHashResult = jedis.ftSearch("hash-idx:users",
             "Paul @age:[30 40]"
        );
        
        System.out.println(findPaulHashResult.getTotalResults()); // >>> 1

        List<Document> paulHashDocs = findPaulHashResult.getDocuments();

        for (Document doc: paulHashDocs) {
            System.out.println(doc.getId());
        }
        // >>> user:3
        // STEP_END
        // REMOVE_START
        assertEquals("huser:3", paulHashDocs.get(0).getId());
        // REMOVE_END

// HIDE_START
        jedis.close();
    }
}
// HIDE_END