Skip to content

Commit 83307b6

Browse files
AndreaNassisisophiadt
authored andcommitted
cherry pick 'Neptune Analytics - Logger' from #19
1 parent 5e54131 commit 83307b6

File tree

7 files changed

+531
-190
lines changed

7 files changed

+531
-190
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@aws/neptune-for-graphql",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44
"description": "CLI utility to create and maintain a GraphQL API for Amazon Neptune",
55
"keywords": [
66
"Amazon Neptune",

src/NeptuneSchema.js

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ import axios from "axios";
1414
import { aws4Interceptor } from "aws4-axios";
1515
import { fromNodeProviderChain } from "@aws-sdk/credential-providers";
1616
import { NeptunedataClient, ExecuteOpenCypherQueryCommand } from "@aws-sdk/client-neptunedata";
17+
import { loggerLog } from "./logger.js";
1718

1819
let HOST = '';
1920
let PORT = 8182;
2021
let REGION = ''
2122
let SAMPLE = 5000;
22-
let VERBOSE = false;
23+
let VERBOSE = false;
24+
let NEPTUNE_TYPE = 'neptune-db';
2325
let language = 'openCypher';
2426
let useSDK = false;
25-
27+
let msg = '';
2628

2729
async function getAWSCredentials() {
2830
const credentialProvider = fromNodeProviderChain();
@@ -31,7 +33,7 @@ async function getAWSCredentials() {
3133
const interceptor = aws4Interceptor({
3234
options: {
3335
region: REGION,
34-
service: "neptune-db",
36+
service: NEPTUNE_TYPE,
3537
},
3638
credentials: cred
3739
});
@@ -55,6 +57,7 @@ function consoleOut(text) {
5557
if (VERBOSE) {
5658
console.log(text);
5759
}
60+
loggerLog(text);
5861
}
5962

6063

@@ -67,11 +70,18 @@ async function queryNeptune(q) {
6770
const response = await axios.post(`https://${HOST}:${PORT}/${language}`, `query=${encodeURIComponent(q)}`);
6871
return response.data;
6972
} catch (error) {
70-
console.error("Http query request failed: ", error.message);
71-
consoleOut("Trying with the AWS SDK");
72-
const response = await queryNeptuneSDK(q);
73-
useSDK = true;
74-
return response;
73+
msg = `Http query request failed: ${error.message}`;
74+
consoleOut.error(msg);
75+
loggerLog(msg);
76+
77+
if (NEPTUNE_TYPE == 'neptune-db') {
78+
consoleOut("Trying with the AWS SDK");
79+
const response = await queryNeptuneSDK(q);
80+
useSDK = true;
81+
return response;
82+
}
83+
84+
throw new Error('AWS SDK for Neptune Analytics is not available, yet.');
7585
}
7686
}
7787
}
@@ -91,7 +101,9 @@ async function queryNeptuneSDK(q) {
91101
return response;
92102

93103
} catch (error) {
94-
console.error("SDK query request failed: ", error.message);
104+
msg = `SDK query request failed: ${error.message}`;
105+
consoleOut.error(msg);
106+
loggerLog(msg);
95107
process.exit(1);
96108
}
97109
}
@@ -100,10 +112,11 @@ async function queryNeptuneSDK(q) {
100112
async function getNodesNames() {
101113
let query = `MATCH (a) RETURN labels(a), count(a)`;
102114
let response = await queryNeptune(query);
115+
loggerLog('Getting nodes names');
103116

104117
try {
105118
response.results.forEach(result => {
106-
schema.nodeStructures.push({ label: result['labels(a)'][0], properties: []});
119+
schema.nodeStructures.push({ label: result['labels(a)'][0], properties: []});
107120
consoleOut(' Found Node: ' + yellow(result['labels(a)'][0]));
108121
});
109122
}
@@ -117,6 +130,7 @@ async function getNodesNames() {
117130
async function getEdgesNames() {
118131
let query = `MATCH ()-[e]->() RETURN type(e), count(e)`;
119132
let response = await queryNeptune(query);
133+
loggerLog('Getting edges names');
120134

121135
try {
122136
response.results.forEach(result => {
@@ -132,8 +146,9 @@ async function getEdgesNames() {
132146
}
133147

134148

135-
async function findFromAndToLabels(edgeStructure) {
136-
let query = `MATCH (from)-[r:${edgeStructure.label}]->(to) RETURN DISTINCT labels(from) as fromLabel, labels(to) as toLabel`;
149+
async function checkEdgeDirection(direction) {
150+
let query = `MATCH (from:${direction.from})-[r:${direction.edge.label}]->(to:${direction.to}) RETURN r as edge LIMIT 1`;
151+
loggerLog(`Checking edge direction: ${query}`);
137152
let response = await queryNeptune(query);
138153
for (let result of response.results) {
139154
for (let fromLabel of result.fromLabel) {
@@ -190,7 +205,8 @@ function addUpdateEdgeProperty(edgeName, name, value) {
190205

191206

192207
async function getEdgeProperties(edge) {
193-
let query = `MATCH ()-[n:${edge.label}]->() RETURN properties(n) as properties LIMIT ${SAMPLE}`;
208+
let query = `MATCH ()-[n:${edge.label}]->() RETURN properties(n) as properties LIMIT ${SAMPLE}`;
209+
loggerLog(`Getting properties for edge: ${query}`);
194210
try {
195211
let response = await queryNeptune(query);
196212
let result = response.results;
@@ -214,7 +230,8 @@ async function getEdgesProperties() {
214230

215231

216232
async function getNodeProperties(node) {
217-
let query = `MATCH (n:${node.label}) RETURN properties(n) as properties LIMIT ${SAMPLE}`;
233+
let query = `MATCH (n:${node.label}) RETURN properties(n) as properties LIMIT ${SAMPLE}`;
234+
loggerLog(`Getting properties for node: ${query}`);
218235
try {
219236
let response = await queryNeptune(query);
220237
let result = response.results;
@@ -238,10 +255,12 @@ async function getNodesProperties() {
238255

239256

240257
async function checkEdgeDirectionCardinality(d) {
241-
let queryFrom = `MATCH (from:${d.from})-[r:${d.edge.label}]->(to:${d.to}) WITH to, count(from) as rels WHERE rels > 1 RETURN rels LIMIT 1`;
258+
let queryFrom = `MATCH (from:${d.from})-[r:${d.edge.label}]->(to:${d.to}) WITH to, count(from) as rels WHERE rels > 1 RETURN rels LIMIT 1`;
259+
loggerLog(`Checking edge direction cardinality: ${queryFrom}`);
242260
let responseFrom = await queryNeptune(queryFrom);
243261
let resultFrom = responseFrom.results[0];
244-
let queryTo = `MATCH (from:${d.from})-[r:${d.edge.label}]->(to:${d.to}) WITH from, count(to) as rels WHERE rels > 1 RETURN rels LIMIT 1`;
262+
let queryTo = `MATCH (from:${d.from})-[r:${d.edge.label}]->(to:${d.to}) WITH from, count(to) as rels WHERE rels > 1 RETURN rels LIMIT 1`;
263+
loggerLog(`Checking edge direction cardinality: ${queryTo}`);
245264
let responseTo = await queryNeptune(queryTo);
246265
let resultTo = responseTo.results[0];
247266
let c = '';
@@ -277,11 +296,12 @@ async function getEdgesDirectionsCardinality() {
277296
}
278297

279298

280-
function setGetNeptuneSchemaParameters(host, port, region, verbose = false) {
299+
function setGetNeptuneSchemaParameters(host, port, region, verbose = false, neptuneType) {
281300
HOST = host;
282301
PORT = port;
283302
REGION = region;
284303
VERBOSE = verbose;
304+
NEPTUNE_TYPE = neptuneType;
285305
}
286306

287307

src/graphdb.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,16 @@ function graphDBInferenceSchema (graphbSchema, addMutations) {
6969
}
7070

7171
r += '\t_id: ID! @id\n';
72-
72+
73+
let properties = [];
7374
node.properties.forEach(property => {
75+
properties.push(property.name);
76+
7477
if (property.name == 'id')
7578
r+= `\tid: ID\n`;
7679
else
7780
r+= `\t${property.name}: ${property.type}\n`;
81+
7882
});
7983

8084
let edgeTypes = [];
@@ -127,11 +131,15 @@ function graphDBInferenceSchema (graphbSchema, addMutations) {
127131
});
128132

129133
// Add edge types
130-
edgeTypes.forEach(edgeType => {
134+
edgeTypes.forEach(edgeType => {
135+
let collision = '';
136+
if (properties.includes(edgeType))
137+
collision = '_';
138+
131139
if (changeCase) {
132-
r += `\t${edgeType}:${toPascalCase(edgeType)}`
140+
r += `\t${collision + edgeType}:${toPascalCase(edgeType)}`
133141
} else {
134-
r += `\t${edgeType}:${edgeType}`
142+
r += `\t${collision + edgeType}:${edgeType}`
135143
}
136144
});
137145

src/logger.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import fs from 'fs';
2+
3+
let LOG_FILE = './output/log.txt';
4+
5+
function loggerInit(file) {
6+
LOG_FILE = file;
7+
fs.writeFile(LOG_FILE, '', (err) => {
8+
return console.log(err);
9+
});
10+
}
11+
12+
function loggerLog(text) {
13+
// remove yellow escape from text
14+
text = text.replaceAll(/\x1b\[33m/g, '');
15+
text = text.replaceAll(/\x1b\[0m/g, '');
16+
17+
fs.appendFileSync(LOG_FILE, (new Date()).toISOString() + ' ' + text + '\n', (err) => {
18+
return console.log(err);
19+
})
20+
}
21+
22+
export { loggerInit, loggerLog };

0 commit comments

Comments
 (0)