@toxplanet/pegasus-sdk 1.1.15 → 1.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/chemicals.js +44 -9
  2. package/package.json +1 -1
package/lib/chemicals.js CHANGED
@@ -75,30 +75,64 @@ class ChemicalsService {
75
75
  _buildChemicalUpsertSql(chemical) {
76
76
  const sql = [
77
77
  'INSERT INTO chemicals (source_id, chemical_name, chemical_meta, chemical_identifiers, chemical_synonyms, chemical_categories, created_at, updated_at)',
78
- 'VALUES (@source_id, @chemical_name, @chemical_meta, @chemical_identifiers, @chemical_synonyms, @chemical_categories, @created_at, @updated_at)',
78
+ 'VALUES (@source_id, @chemical_name, @chemical_meta::jsonb, @chemical_identifiers::jsonb, @chemical_synonyms, @chemical_categories, @created_at, @updated_at)',
79
79
  'ON CONFLICT (source_id) DO UPDATE SET',
80
80
  ' chemical_name = @chemical_name,',
81
- ' chemical_meta = @chemical_meta,',
82
- ' chemical_identifiers = @chemical_identifiers,',
81
+ ' chemical_meta = @chemical_meta::jsonb,',
82
+ ' chemical_identifiers = @chemical_identifiers::jsonb,',
83
83
  ' chemical_synonyms = @chemical_synonyms,',
84
84
  ' chemical_categories = @chemical_categories,',
85
85
  ' updated_at = @updated_at'
86
86
  ].join('\n');
87
87
 
88
+ const serializeDate = (d) => d instanceof Date ? d.toISOString() : d;
89
+
88
90
  const parameters = {
89
91
  '@source_id': chemical.sourceId,
90
92
  '@chemical_name': chemical.chemicalName,
91
- '@chemical_meta': chemical.chemicalMeta,
92
- '@chemical_identifiers': chemical.chemicalIdentifiers,
93
- '@chemical_synonyms': chemical.chemicalSynonyms,
94
- '@chemical_categories': chemical.chemicalCategories,
95
- '@created_at': chemical.createdAt instanceof Date ? chemical.createdAt.toISOString() : chemical.createdAt,
96
- '@updated_at': chemical.updatedAt instanceof Date ? chemical.updatedAt.toISOString() : chemical.updatedAt
93
+ '@chemical_meta': JSON.stringify(chemical.chemicalMeta ?? {}),
94
+ '@chemical_identifiers': JSON.stringify(chemical.chemicalIdentifiers ?? {}),
95
+ '@chemical_synonyms': JSON.stringify(chemical.chemicalSynonyms ?? []),
96
+ '@chemical_categories': JSON.stringify(chemical.chemicalCategories ?? []),
97
+ '@created_at': serializeDate(chemical.createdAt),
98
+ '@updated_at': serializeDate(chemical.updatedAt)
97
99
  };
98
100
 
99
101
  return { sql, parameters };
100
102
  }
101
103
 
104
+ _buildDebugSql(chemical) {
105
+ const esc = (s) => `'${String(s ?? '').replace(/'/g, "''")}'`;
106
+ const escJson = (v) => `'${JSON.stringify(v ?? {}).replace(/'/g, "''")}'`;
107
+ const escArr = (arr) => {
108
+ if (!Array.isArray(arr) || arr.length === 0) return `ARRAY[]::text[]`;
109
+ return `ARRAY[${arr.map(s => esc(s)).join(', ')}]`;
110
+ };
111
+ const escDate = (d) => esc(d instanceof Date ? d.toISOString() : (d ?? new Date().toISOString()));
112
+
113
+ return [
114
+ `INSERT INTO chemicals`,
115
+ ` (source_id, chemical_name, chemical_meta, chemical_identifiers, chemical_synonyms, chemical_categories, created_at, updated_at)`,
116
+ `VALUES (`,
117
+ ` ${esc(chemical.sourceId)},`,
118
+ ` ${esc(chemical.chemicalName)},`,
119
+ ` ${escJson(chemical.chemicalMeta)}::jsonb,`,
120
+ ` ${escJson(chemical.chemicalIdentifiers)}::jsonb,`,
121
+ ` ${escArr(chemical.chemicalSynonyms)},`,
122
+ ` ${escArr(chemical.chemicalCategories)},`,
123
+ ` ${escDate(chemical.createdAt)},`,
124
+ ` ${escDate(chemical.updatedAt)}`,
125
+ `)`,
126
+ `ON CONFLICT (source_id) DO UPDATE SET`,
127
+ ` chemical_name = ${esc(chemical.chemicalName)},`,
128
+ ` chemical_meta = ${escJson(chemical.chemicalMeta)}::jsonb,`,
129
+ ` chemical_identifiers = ${escJson(chemical.chemicalIdentifiers)}::jsonb,`,
130
+ ` chemical_synonyms = ${escArr(chemical.chemicalSynonyms)},`,
131
+ ` chemical_categories = ${escArr(chemical.chemicalCategories)},`,
132
+ ` updated_at = NOW();`
133
+ ].join('\n');
134
+ }
135
+
102
136
  async bulkIndexFielded(documents) {
103
137
  try {
104
138
  logInfo('pegasus-sdk', `[bulkIndexFielded] Starting bulk index with ${documents?.length || 0} documents`);
@@ -139,6 +173,7 @@ class ChemicalsService {
139
173
  };
140
174
 
141
175
  logInfo('pegasus-sdk', `[bulkIndexFielded] Prepared chemical object: sourceId=${chemical.sourceId}, chemicalName=${chemical.chemicalName}`);
176
+ logInfo('pegasus-sdk', `[bulkIndexFielded] DEBUG SQL for document ${i}:\n${this._buildDebugSql(chemical)}`);
142
177
 
143
178
  const isConnectionError = (err) =>
144
179
  err.message?.toLowerCase().includes('timeout') ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toxplanet/pegasus-sdk",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "description": "SDK for migrating chemical data to Pegasus PostgreSQL + OpenSearch architecture with Elasticsearch client compatibility",
5
5
  "main": "index.js",
6
6
  "type": "commonjs",