diff --git a/doctests/home-query.js b/doctests/home-query.js new file mode 100644 index 0000000000..b5b5bd5ba5 --- /dev/null +++ b/doctests/home-query.js @@ -0,0 +1,205 @@ +// EXAMPLE: js_home_query +// BINDER_ID nodejs-js_home_query +// REMOVE_START +import assert from "node:assert"; +// REMOVE_END +// STEP_START import +import { + createClient, + SCHEMA_FIELD_TYPE, + FT_AGGREGATE_GROUP_BY_REDUCERS, + FT_AGGREGATE_STEPS, +} from 'redis'; +// STEP_END + +// STEP_START create_data +const user1 = { + name: 'Paul John', + email: 'paul.john@example.com', + age: 42, + city: 'London' +}; + +const user2 = { + name: 'Eden Zamir', + email: 'eden.zamir@example.com', + age: 29, + city: 'Tel Aviv' +}; + +const user3 = { + name: 'Paul Zamir', + email: 'paul.zamir@example.com', + age: 35, + city: 'Tel Aviv' +}; +// STEP_END + +// STEP_START connect +const client = await createClient(); +await client.connect(); +// STEP_END + +// STEP_START cleanup_json +await client.ft.dropIndex('idx:users', { DD: true }).then(() => {}, () => {}); +// STEP_END + +// STEP_START create_index +await client.ft.create('idx:users', { + '$.name': { + type: SCHEMA_FIELD_TYPE.TEXT, + AS: 'name' + }, + '$.city': { + type: SCHEMA_FIELD_TYPE.TEXT, + AS: 'city' + }, + '$.age': { + type: SCHEMA_FIELD_TYPE.NUMERIC, + AS: 'age' + } +}, { + ON: 'JSON', + PREFIX: 'user:' +}); +// STEP_END + +// STEP_START add_data +const [user1Reply, user2Reply, user3Reply] = await Promise.all([ + client.json.set('user:1', '$', user1), + client.json.set('user:2', '$', user2), + client.json.set('user:3', '$', user3) +]); +// STEP_END +// REMOVE_START +assert.equal(user1Reply, 'OK'); +assert.equal(user2Reply, 'OK'); +assert.equal(user3Reply, 'OK'); +// REMOVE_END + +// STEP_START query1 +let findPaulResult = await client.ft.search('idx:users', 'Paul @age:[30 40]'); + +console.log(findPaulResult.total); // >>> 1 + +findPaulResult.documents.forEach(doc => { + console.log(`ID: ${doc.id}, name: ${doc.value.name}, age: ${doc.value.age}`); +}); +// >>> ID: user:3, name: Paul Zamir, age: 35 +// STEP_END +// REMOVE_START +assert.equal(findPaulResult.total, 1); +assert.equal(findPaulResult.documents[0].id, 'user:3'); +// REMOVE_END + +// STEP_START query2 +let citiesResult = await client.ft.search('idx:users', '*',{ + RETURN: 'city' +}); + +console.log(citiesResult.total); // >>> 3 + +citiesResult.documents.forEach(cityDoc => { + console.log(cityDoc.value); +}); +// >>> { city: 'London' } +// >>> { city: 'Tel Aviv' } +// >>> { city: 'Tel Aviv' } +// STEP_END +// REMOVE_START +assert.equal(citiesResult.total, 3); +citiesResult.documents.sort((a, b) => a.value.city.localeCompare(b.value.city)); +assert.deepEqual(citiesResult.documents.map(doc => doc.value.city), [ + 'London', + 'Tel Aviv', + 'Tel Aviv' +]); +// REMOVE_END + +// STEP_START query3 +let aggResult = await client.ft.aggregate('idx:users', '*', { + STEPS: [{ + type: FT_AGGREGATE_STEPS.GROUPBY, + properties: '@city', + REDUCE: [{ + type: FT_AGGREGATE_GROUP_BY_REDUCERS.COUNT, + AS: 'count' + }] + }] +}); + +console.log(aggResult.total); // >>> 2 + +aggResult.results.forEach(result => { + console.log(`${result.city} - ${result.count}`); +}); +// >>> London - 1 +// >>> Tel Aviv - 2 +// STEP_END +// REMOVE_START +assert.equal(aggResult.total, 2); +aggResult.results.sort((a, b) => a.city.localeCompare(b.city)); +assert.deepEqual(aggResult.results.map(result => result.city), [ + 'London', + 'Tel Aviv' +]); +assert.deepEqual(aggResult.results.map(result => result.count), [ + 1, + 2 +]); +// REMOVE_END + +// STEP_START cleanup_hash +await client.ft.dropIndex('hash-idx:users', { DD: true }).then(() => {}, () => {}); +// STEP_END + +// STEP_START create_hash_index +await client.ft.create('hash-idx:users', { + 'name': { + type: SCHEMA_FIELD_TYPE.TEXT + }, + 'city': { + type: SCHEMA_FIELD_TYPE.TEXT + }, + 'age': { + type: SCHEMA_FIELD_TYPE.NUMERIC + } +}, { + ON: 'HASH', + PREFIX: 'huser:' +}); +// STEP_END + +// STEP_START add_hash_data +const [huser1Reply, huser2Reply, huser3Reply] = await Promise.all([ + client.hSet('huser:1', user1), + client.hSet('huser:2', user2), + client.hSet('huser:3', user3) +]); +// STEP_END +// REMOVE_START +assert.equal(huser1Reply, 4); +assert.equal(huser2Reply, 4); +assert.equal(huser3Reply, 4); +// REMOVE_END + +// STEP_START query1_hash +let findPaulHashResult = await client.ft.search( + 'hash-idx:users', 'Paul @age:[30 40]' +); + +console.log(findPaulHashResult.total); // >>> 1 + +findPaulHashResult.documents.forEach(doc => { + console.log(`ID: ${doc.id}, name: ${doc.value.name}, age: ${doc.value.age}`); +}); +// >>> ID: huser:3, name: Paul Zamir, age: 35 +// STEP_END +// REMOVE_START +assert.equal(findPaulHashResult.total, 1); +assert.equal(findPaulHashResult.documents[0].id, 'huser:3'); +// REMOVE_END + +// STEP_START close +await client.quit(); +// STEP_END