Searching
Search Results
search
function returns a
node stream in object mode
if no callback is provided.
- Node.js
const stream = require("stream");
const writableStream = stream.Writable({ objectMode: true });
writableStream._write = (chunk, enc, next) => {
// ...
next();
};
const customerStream = gateway.customer.search((search) => {
search.company().is("Acme Inc.");
});
customerStream.pipe(writableStream);
- Node.js
const customerStream = gateway.customer.search((search) => {
search.company().is("Acme Inc.");
});
customerStream.on("data", (customer) => {
// ...
});
customerStream.on("end", () => {
// ...
});
customerStream.resume();
Iterable responses
If a callback is provided to the search
function, an object with the
each
method defined is yielded.
- Node.js
gateway.customer.search((search) => {
search.company().is("Acme Inc.");
}, (err, response) => {
response.each((err, customer) => {
// ...
});
});
Race conditions
To optimize the processing of large searches, data is retrieved from the server lazily.
Initially, the server returns a list of ids that matched the search criteria. While you're iterating
over search results, the data for each record is fetched dynamically. This causes race conditions to
exist when records are modified on the server while you are iterating over them.
Records are deleted
If a record is deleted server-side while you are iterating over the results, that record is
skipped.
Records are updated
If a record is updated server-side while you are iterating over the results, one of two things could
happen:
- the record still matches the search criteria and the modified record is returned
- the record no longer matches the search criteria and is skipped
Maximum size
Because of the race conditions described above, you can't know how many search results you have
while iterating over them. You do, however, know the maximum number of results that will be given.
- Node.js
const customerStream = gateway.customer.search((search) => {
search.company().is("Acme Inc.");
});
customerStream.on("ready", () => {
customerStream.searchResponse.length();
});