-
Notifications
You must be signed in to change notification settings - Fork 5
/
generate_graphdata.js
140 lines (129 loc) · 3.26 KB
/
generate_graphdata.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
console.log("db file", process.argv[2]);
const sqlite3 = require('sqlite3').verbose();
const dbFile = process.argv[2];
const db = new sqlite3.Database(dbFile);
const fs = require('fs');
/**
* Parses the string of properties and returns an object containing the key-value pairs.
* If the key is 'FILE', the corresponding value is processed to extract the filename.
* @param {string} s - The string of properties.
* @returns {Object} - The object containing the parsed properties.
*/
function parseProperties(s) {
const properties = {};
s.match(/\"(.*?)\" \. \"(.*?)\"/g).forEach(match => {
const [key, value] = match.match(/\"(.*?)\"/g).map(v => v.replace(/"/g, ''));
properties[key] = key === 'FILE' ? getFilename(value) : value;
});
return removeQuotesFromObject(properties);
}
/**
* Removes the double quotes from the object.
* @param {Object} obj - The object to be processed.
* @returns {Object} - The object without double quotes.
*/
function removeQuotesFromObject(obj) {
for (let key in obj) {
if (typeof obj[key] === 'string') {
obj[key] = obj[key].replace(/^"|"$/g, '');
} else if (typeof obj[key] === 'object') {
obj[key] = removeQuotesFromObject(obj[key]);
}
}
return obj;
}
/**
* Extracts the filename from the path.
* @param {string} path - The path to be processed.
* @returns {string} - The filename.
*/
function getFilename(path) {
return path.split('/').pop();
}
const queryNodes = `
SELECT
GROUP_CONCAT(tags.tag) AS tags,
nodes.properties,
nodes.olp,
nodes.pos,
nodes.level,
nodes.title,
nodes.file,
nodes.id
FROM
nodes
LEFT JOIN
tags
ON
nodes.id = tags.node_id
GROUP BY
nodes.id
`;
const queryIdLinks = `
SELECT
type,
dest as target,
source
FROM
links
WHERE
type = '"id"'
`;
const queryCites = `
SELECT
citations.node_id as citeNodeId,
citations.cite_key as citeKey,
refs.node_id as refNodeId
FROM
citations
LEFT JOIN refs ON citations.cite_key = refs.ref
`
const queryTags = `
SELECT
tags.tag
FROM
tags
GROUP BY
tags.tag
`;
const graphdata = {
type: "graphdata",
data: {},
};
db.all(queryNodes, (_, nodes) =>
db.all(queryIdLinks, (_, links) =>
db.all(queryCites, (_, cites) =>
db.all(queryTags, (_, tags) => {
graphdata.data.nodes = nodes.map(node => {
const splitTags = node.tags?.split(',') ?? [null];
const olp = node.olp?.replace(/\(\"|\"\)/g, '').split(' ') ?? null;
return{
...node,
olp,
tags: splitTags,
file: getFilename(node.file),
properties: parseProperties(node.properties),
};
});
graphdata.data.links = [
...links,
...cites.map(cite => cite.refNodeId ? ({
type: 'ref',
source: cite.citeNodeId,
target: cite.refNodeId,
}) : ({
type: 'cite',
source: cite.citeNodeId,
target: cite.citeKey,
})),
];
graphdata.data.tags = tags.length ? tags.map(t => t.tag) : null;
fs.writeFile('graphdata.json', JSON.stringify(removeQuotesFromObject(graphdata)), (err) => {
if (err) throw err;
console.log('The file has been saved!');
});
}),
)
),
);
db.close();