From ec9b955b48fdb3a4627a8fbad0b990fbb18fafb5 Mon Sep 17 00:00:00 2001 From: Clemens Wolff Date: Mon, 3 Jul 2017 12:25:52 -0700 Subject: [PATCH 1/3] Extract shared Fact typedef --- src/resolvers-cassandra/Facts/queries.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/resolvers-cassandra/Facts/queries.js b/src/resolvers-cassandra/Facts/queries.js index 8f01d0a..26eb10f 100644 --- a/src/resolvers-cassandra/Facts/queries.js +++ b/src/resolvers-cassandra/Facts/queries.js @@ -2,16 +2,20 @@ const withRunTime = require('../shared').withRunTime; +/** + * @typedef {id: string, language: string, title: string, tags: string[], date: string, link: string, text: string, sources: string[]} Fact + */ + /** * @param {{pageSize: number, skip: number, tagFilter: string[]}} args - * @returns {Promise.<{runTime: string, type: string, facts: Array<{id: string, language: string, title: string, tags: string[], date: string, link: string, text: string, sources: string[]}>}>} + * @returns {Promise.<{runTime: string, type: string, facts: Fact[]}>} */ function list(args, res) { // eslint-disable-line no-unused-vars } /** * @param {{id: string}} args - * @returns {Promise.<{id: string, language: string, title: string, tags: string[], date: string, link: string, text: string, sources: string[]}>} + * @returns {Promise.} */ function get(args, res) { // eslint-disable-line no-unused-vars } From 8b30f5b53b23909ac4117d140bd6059355435dd3 Mon Sep 17 00:00:00 2001 From: Clemens Wolff Date: Mon, 3 Jul 2017 12:41:04 -0700 Subject: [PATCH 2/3] Implement FactSchema.list --- src/resolvers-cassandra/Facts/queries.js | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/resolvers-cassandra/Facts/queries.js b/src/resolvers-cassandra/Facts/queries.js index 26eb10f..2bdc0f9 100644 --- a/src/resolvers-cassandra/Facts/queries.js +++ b/src/resolvers-cassandra/Facts/queries.js @@ -1,16 +1,57 @@ 'use strict'; +const Promise = require('promise'); +const cassandraConnector = require('../../clients/cassandra/CassandraConnector'); const withRunTime = require('../shared').withRunTime; /** * @typedef {id: string, language: string, title: string, tags: string[], date: string, link: string, text: string, sources: string[]} Fact */ +function cassandraRowToFact(row) { + return { + id: row.id, + language: row.eventlangcode, + title: row.title, + tags: row.detectedkeywords, + date: row.event_time, + link: row.sourceurl, + text: row.messagebody, + sources: row.pipeline && [row.pipeline] + }; +} + +function appendDefaultFilters(query, params) { + query += ' AND pipeline IN ("TadaWeb", "Bing", "CustomEvent")'; + return {query: query, params: params}; +} + +function makeListQuery(args) { + const tagsCondition = args.tagFilter.map(_ => 'detectedkeywords CONTAINS ?').join(' OR '); // eslint-disable-line no-unused-vars + const query = `SELECT * FROM fortis.events WHERE (${tagsCondition})`; + const params = args.tagFilter.slice(); + return appendDefaultFilters(query, params); +} + /** * @param {{pageSize: number, skip: number, tagFilter: string[]}} args * @returns {Promise.<{runTime: string, type: string, facts: Fact[]}>} */ function list(args, res) { // eslint-disable-line no-unused-vars + return new Promise((resolve, reject) => { + if (!args || !args.tagFilter || !args.tagFilter.length) return reject('No tags specified to fetch'); + + const query = makeListQuery(args); + return cassandraConnector.executeQuery(query.query, query.params) + .then(rows => { + const facts = rows.map(cassandraRowToFact); + + resolve({ + facts: facts + }); + }) + .catch(reject); + }); } /** From a6d78fd65483de7ad3d4cb56fe2249d3571a9f1b Mon Sep 17 00:00:00 2001 From: Clemens Wolff Date: Mon, 3 Jul 2017 12:41:25 -0700 Subject: [PATCH 3/3] Implement FactSchema.get --- src/resolvers-cassandra/Facts/queries.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/resolvers-cassandra/Facts/queries.js b/src/resolvers-cassandra/Facts/queries.js index 2bdc0f9..fce0fbb 100644 --- a/src/resolvers-cassandra/Facts/queries.js +++ b/src/resolvers-cassandra/Facts/queries.js @@ -54,11 +54,29 @@ function list(args, res) { // eslint-disable-line no-unused-vars }); } +function makeGetQuery(args) { + let query = 'SELECT * FROM fortis.events WHERE id = ?'; + let params = [args.id]; + return appendDefaultFilters(query, params); +} + /** * @param {{id: string}} args * @returns {Promise.} */ function get(args, res) { // eslint-disable-line no-unused-vars + return new Promise((resolve, reject) => { + if (!args || !args.id) return reject('No id specified to fetch'); + + const query = makeGetQuery(args); + return cassandraConnector.executeQuery(query.query, query.params) + .then(rows => { + if (rows.length > 1) return reject(`Got more ${rows.length} faces with id ${args.id}`); + + resolve(cassandraRowToFact(rows[0])); + }) + .catch(reject); + }); } module.exports = {