Thomas 3 years ago
parent
commit
2aab373f64
5 changed files with 365 additions and 80 deletions
  1. 93 24
      index.js
  2. 94 27
      index.ts
  3. 1 0
      test.json
  4. 91 13
      workers/esearch.js
  5. 86 16
      workers/esearch.ts

+ 93 - 24
index.js

@@ -18,25 +18,7 @@ const piscina_1 = __importDefault(require("piscina"));
     const getEsearch = new piscina_1.default({
         filename: path_1.default.resolve(__dirname, './workers/esearch.js')
     });
-    // const orders = 
-    // [
-    //     {
-    //         params: {
-    //             db: 'nuccore',
-    //             term: 'NM_001143971.2'
-    //         },
-    //         xpath: 'string((//Id)[1])'
-    //     },
-    //     {
-    //         params: {
-    //             db: 'gene',
-    //             term: 'NM_001143971.2'
-    //         },
-    //         xpath: 'string((//Id)[1])'
-    //     },
-    // ]
-    // const results = await Promise.all(orders.map(e => getEsearch.run(e)))
-    // console.log(results);
+    // https://www.ncbi.nlm.nih.gov/books/NBK25499/
     const orders = [
         // {
         //     params: {
@@ -55,15 +37,102 @@ const piscina_1 = __importDefault(require("piscina"));
         //     retmode: 'xml',
         //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi'
         // },
+        // {
+        //     term: 'NOTCH1 AND Human AND Refseq',
+        //     db: 'nuccore',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi',
+        //     query: `$..Id`
+        // },
+        // {
+        //     term: 'NOTCH1[Gene Name]+AND+Human',
+        //     db: 'gene',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi',
+        //     query: `$..Id` 
+        // },
+        // {
+        //     db: 'pubmed',
+        //     id: '19393038',
+        //     retmode: 'xml',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi',
+        //     //query: `$..AbstractText[?(@.Label==='RESULTS')]`
+        //     query: `$..AbstractText`
+        // },
         {
-            db: 'pubmed',
-            id: '19393038',
+            db: 'gene',
+            id: '4851',
             retmode: 'xml',
             endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi',
-            //query: `$..AbstractText[?(@.Label==='RESULTS')]`
-            query: `$..AbstractText`
+            query: [
+                `{ "Locus"           : **.Gene_ref_locus,
+                   "Synonyms"        : [**.Entrezgene_gene.**.Gene_ref_syn_E],
+                   "Update_Date"     : **.Gene_track_update_date.Date.Date_std.Date_std.{"Year": Date_std_year, "Month": Date_std_month, "Day": Date_std_month},
+                   "Location"        : **.Gene_ref_maploc,
+                   "Summary"         : **.Entrezgene_summary,
+                   "Genomic_Position": **.Entrezgene_locus.Gene_commentary[Gene_commentary_type.value='genomic'][0].{
+                       "Accession": Gene_commentary_accession,
+                       "Positions": $.{
+                           "from"  : Gene_commentary_seqs.**.Seq_interval_from,
+                           "to"    : Gene_commentary_seqs.**.Seq_interval_to,
+                           "strand": Gene_commentary_seqs.**.Na_strand.value
+                        }
+                    },
+                    "Gene_Ontology"  : **.Entrezgene_properties.Gene_commentary[Gene_commentary_heading='GeneOntology'].Gene_commentary_comment.{
+                        "Functions"  : Gene_commentary[Gene_commentary_label='Function'].Gene_commentary_comment.Gene_commentary.{
+                            "ID"      : Gene_commentary_source.Other_source.**.Object_id_id,
+                            "Pre_Text": Gene_commentary_source.Other_source.Other_source_pre_text,
+                            "Anchor"  : Gene_commentary_source.Other_source.Other_source_anchor
+                        },
+                        "Processes"  : Gene_commentary[Gene_commentary_label='Process'].Gene_commentary_comment.Gene_commentary.{
+                            "ID"      : Gene_commentary_source.Other_source.**.Object_id_id,
+                            "Pre_Text": Gene_commentary_source.Other_source.Other_source_pre_text,
+                            "Anchor"  : Gene_commentary_source.Other_source.Other_source_anchor
+                        },
+                        "Components"  : Gene_commentary[Gene_commentary_label='Component'].Gene_commentary_comment.Gene_commentary.{
+                            "ID"      : Gene_commentary_source.Other_source.**.Object_id_id,
+                            "Pre_Text": Gene_commentary_source.Other_source.Other_source_pre_text,
+                            "Anchor"  : Gene_commentary_source.Other_source.Other_source_anchor
+                        }
+                    },
+                    "Transcript": {
+                        "Accession" : **.'Entrezgene_comments'.'Gene_commentary'[Gene_commentary_heading='NCBI Reference Sequences (RefSeq)'].**.Gene_commentary[Gene_commentary_heading='mRNA Sequence'][0].Gene_commentary_accession,
+                        "Exon_Count": **.'Entrezgene_properties'.'Gene_commentary'[Gene_commentary_label='Exon count'].Gene_commentary_text
+                    },
+                    "Products": **.'Entrezgene_comments'.'Gene_commentary'[Gene_commentary_heading='NCBI Reference Sequences (RefSeq)'].**.Gene_commentary[Gene_commentary_heading='mRNA Sequence'][0].Gene_commentary_products.Gene_commentary[Gene_commentary_heading='Product'][0].{
+                        "Accession": Gene_commentary_accession,
+                        "Domains"  : Gene_commentary_comment.Gene_commentary[Gene_commentary_heading='Conserved Domains'].Gene_commentary_comment.Gene_commentary.{
+                            "DB"      : Gene_commentary_source.**.Dbtag_db,
+                            "ID"      : Gene_commentary_source.**.Object_id_id,
+                            "Anchor"  : Gene_commentary_source.**.Other_source_anchor,
+                            "Location": Gene_commentary_comment.**.Gene_commentary_text
+                        }
+                    },
+                    "Biblio_PMID": **.PubMedId
+                }`
+            ]
         },
+        // {
+        //     db: 'gene',
+        //     id: '4851',
+        //     retmode: 'xml',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi',
+        //     //query: `$..AbstractText[?(@.Label==='RESULTS')]`
+        //     query: [
+        //         `$..Name`, 
+        //         `$..Description`, 
+        //         `$..MapLocation`, 
+        //         '$..OtherAliases',
+        //         `$..OtherDesignations`,
+        //         '$..ChrLoc',
+        //         `$..GenomicInfoType..ChrAccVer`,
+        //         '$..GenomicInfoType..ChrStart',
+        //         '$..GenomicInfoType..ChrStop',
+        //         '$..ExonCount',
+        //         '$..GeneWeight',
+        //         '$..Summary',
+        //     ]
+        // },
     ];
     const results = yield Promise.all(orders.map(e => getEsearch.run(e)));
-    console.log(...results);
+    console.log(orders.map((e, i) => (Object.assign(Object.assign({}, e), { results: results[i] })))[0].results.value);
+    // await fs.promises.writeFile('test.json',JSON.stringify(orders.map((e:any, i) => ({...e, results: results[i]})).map(e => e.results)[0]))
 }))();

+ 94 - 27
index.ts

@@ -1,35 +1,15 @@
 'use strict'
 
+import fs from "fs"
 import path from "path"
 import Piscina from "piscina"
 
-
 (async()=>{
     const getEsearch = new Piscina({
         filename: path.resolve(__dirname, './workers/esearch.js')
     })
 
-    // const orders = 
-    // [
-    //     {
-    //         params: {
-    //             db: 'nuccore',
-    //             term: 'NM_001143971.2'
-    //         },
-    //         xpath: 'string((//Id)[1])'
-    //     },
-    //     {
-    //         params: {
-    //             db: 'gene',
-    //             term: 'NM_001143971.2'
-    //         },
-    //         xpath: 'string((//Id)[1])'
-    //     },
-    // ]
-    // const results = await Promise.all(orders.map(e => getEsearch.run(e)))
-    // console.log(results);
-
-
+    // https://www.ncbi.nlm.nih.gov/books/NBK25499/
     const orders =
     [
         // {
@@ -49,15 +29,102 @@ import Piscina from "piscina"
         //     retmode: 'xml',
         //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi'
         // },
+        // {
+        //     term: 'NOTCH1 AND Human AND Refseq',
+        //     db: 'nuccore',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi',
+        //     query: `$..Id`
+        // },
+        // {
+        //     term: 'NOTCH1[Gene Name]+AND+Human',
+        //     db: 'gene',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi',
+        //     query: `$..Id` 
+        // },
+        // {
+        //     db: 'pubmed',
+        //     id: '19393038',
+        //     retmode: 'xml',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi',
+        //     //query: `$..AbstractText[?(@.Label==='RESULTS')]`
+        //     query: `$..AbstractText`
+        // },
         {
-            db: 'pubmed',
-            id: '19393038',
+            db: 'gene',
+            id: '4851',
             retmode: 'xml',
             endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi',
-            //query: `$..AbstractText[?(@.Label==='RESULTS')]`
-            query: `$..AbstractText`
+            query: [
+                `{ "Locus"           : **.Gene_ref_locus,
+                   "Update_Date"     : **.Gene_track_update_date.Date.Date_std.Date_std.{"Year": Date_std_year, "Month": Date_std_month, "Day": Date_std_month},
+                   "Location"        : **.Gene_ref_maploc,
+                   "Summary"         : **.Entrezgene_summary,
+                   "Genomic_Position": **.Entrezgene_locus.Gene_commentary[Gene_commentary_type.value='genomic'][0].{
+                       "Accession": Gene_commentary_accession,
+                       "Positions": $.{
+                           "from"  : Gene_commentary_seqs.**.Seq_interval_from,
+                           "to"    : Gene_commentary_seqs.**.Seq_interval_to,
+                           "strand": Gene_commentary_seqs.**.Na_strand.value
+                        }
+                    },
+                    "Gene_Ontology"  : **.Entrezgene_properties.Gene_commentary[Gene_commentary_heading='GeneOntology'].Gene_commentary_comment.{
+                        "Functions"  : Gene_commentary[Gene_commentary_label='Function'].Gene_commentary_comment.Gene_commentary.{
+                            "ID"      : Gene_commentary_source.Other_source.**.Object_id_id,
+                            "Pre_Text": Gene_commentary_source.Other_source.Other_source_pre_text,
+                            "Anchor"  : Gene_commentary_source.Other_source.Other_source_anchor
+                        },
+                        "Processes"  : Gene_commentary[Gene_commentary_label='Process'].Gene_commentary_comment.Gene_commentary.{
+                            "ID"      : Gene_commentary_source.Other_source.**.Object_id_id,
+                            "Pre_Text": Gene_commentary_source.Other_source.Other_source_pre_text,
+                            "Anchor"  : Gene_commentary_source.Other_source.Other_source_anchor
+                        },
+                        "Components"  : Gene_commentary[Gene_commentary_label='Component'].Gene_commentary_comment.Gene_commentary.{
+                            "ID"      : Gene_commentary_source.Other_source.**.Object_id_id,
+                            "Pre_Text": Gene_commentary_source.Other_source.Other_source_pre_text,
+                            "Anchor"  : Gene_commentary_source.Other_source.Other_source_anchor
+                        }
+                    },
+                    "Transcript": {
+                        "Accession" : **.'Entrezgene_comments'.'Gene_commentary'[Gene_commentary_heading='NCBI Reference Sequences (RefSeq)'].**.Gene_commentary[Gene_commentary_heading='mRNA Sequence'][0].Gene_commentary_accession,
+                        "Exon_Count": **.'Entrezgene_properties'.'Gene_commentary'[Gene_commentary_label='Exon count'].Gene_commentary_text
+                    },
+                    "Products": **.'Entrezgene_comments'.'Gene_commentary'[Gene_commentary_heading='NCBI Reference Sequences (RefSeq)'].**.Gene_commentary[Gene_commentary_heading='mRNA Sequence'][0].Gene_commentary_products.Gene_commentary[Gene_commentary_heading='Product'][0].{
+                        "Accession": Gene_commentary_accession,
+                        "Domains"  : Gene_commentary_comment.Gene_commentary[Gene_commentary_heading='Conserved Domains'].Gene_commentary_comment.Gene_commentary.{
+                            "DB"      : Gene_commentary_source.**.Dbtag_db,
+                            "ID"      : Gene_commentary_source.**.Object_id_id,
+                            "Anchor"  : Gene_commentary_source.**.Other_source_anchor,
+                            "Location": Gene_commentary_comment.**.Gene_commentary_text
+                        }
+                    },
+                    "Biblio_PMID": **.PubMedId
+                }`
+            ]
         },
+        // {
+        //     db: 'gene',
+        //     id: '4851',
+        //     retmode: 'xml',
+        //     endpoint: 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi',
+        //     //query: `$..AbstractText[?(@.Label==='RESULTS')]`
+        //     query: [
+        //         `$..Name`, 
+        //         `$..Description`, 
+        //         `$..MapLocation`, 
+        //         '$..OtherAliases',
+        //         `$..OtherDesignations`,
+        //         '$..ChrLoc',
+        //         `$..GenomicInfoType..ChrAccVer`,
+        //         '$..GenomicInfoType..ChrStart',
+        //         '$..GenomicInfoType..ChrStop',
+        //         '$..ExonCount',
+        //         '$..GeneWeight',
+        //         '$..Summary',
+        //     ]
+        // },
+
     ]
     const results = await Promise.all(orders.map(e => getEsearch.run(e)))
-    console.log(...results);
+    console.log(orders.map((e:any, i) => ({...e, results: results[i]}))[0].results.value);
+    // await fs.promises.writeFile('test.json',JSON.stringify(orders.map((e:any, i) => ({...e, results: results[i]})).map(e => e.results)[0]))
 })()

+ 1 - 0
test.json

@@ -0,0 +1 @@
+[{"query":"$..Gene-track_update-date..Date-std_year","value":2022},{"query":"$..Gene-track_update-date..Date-std_month","value":2},{"query":"$..Gene-track_update-date..Date-std_day","value":20},{"query":"$..Gene-ref_locus","value":"NOTCH1"},{"query":"$..Gene-ref_maploc","value":"9q34.3"},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_accession","value":"NC_000009"},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_seqs..Seq-interval_from","value":136494432},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_seqs..Seq-interval_to","value":136546047},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_products.Gene-commentary[0].Gene-commentary_accession","value":"NM_017617"},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_products.Gene-commentary[0].Gene-commentary_genomic-coords..Seq-loc[0]..Seq-interval_from","value":136545725},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_products.Gene-commentary[0].Gene-commentary_genomic-coords..Seq-loc[0]..Seq-interval_to","value":136546047},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_products.Gene-commentary[0].Gene-commentary_genomic-coords..Seq-loc[0]..Seq-interval_strand","value":{"value":"minus"}},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_products.Gene-commentary[0].Gene-commentary_genomic-coords..Seq-loc[0]..Seq-id_gi","value":568815589},{"query":"$..Entrezgene_locus.Gene-commentary[0].Gene-commentary_products.Gene-commentary[0].Gene-commentary_products.Gene-commentary.Gene-commentary_accession","value":"NP_060087"}]

+ 91 - 13
workers/esearch.js

@@ -15,13 +15,82 @@ Object.defineProperty(exports, "__esModule", { value: true });
 const axios_1 = __importDefault(require("axios"));
 const genbank_parser_1 = __importDefault(require("genbank-parser"));
 const fast_xml_parser_1 = require("fast-xml-parser");
-const jsonpath_plus_1 = require("jsonpath-plus");
+const jsonata_1 = __importDefault(require("jsonata"));
+const simpleJSON = (json) => {
+    if (Array.isArray(json)) {
+        if (json.length === 1) {
+            return simpleJSON(json[0]);
+        }
+        else {
+            return json;
+        }
+    }
+    else if (typeof json === 'object') {
+        if (Object.keys(json).length === 1 && typeof json[Object.keys(json)[0]] === 'object') {
+            return simpleJSON(json[Object.keys(json)[0]]);
+        }
+        else {
+            return json;
+        }
+    }
+    else {
+        return json;
+    }
+};
+const renameKeys = (json) => {
+    if (Array.isArray(json)) {
+        return json.map(e => renameKeys(e));
+    }
+    else {
+        const newObj = {};
+        Object.keys(json).map(key => {
+            let tmp;
+            if (typeof json[key] === 'object') {
+                tmp = renameKeys(json[key]);
+            }
+            else {
+                tmp = json[key];
+            }
+            newObj[key.replace(/-/g, "_")] = tmp;
+        });
+        return newObj;
+    }
+};
 const getEsearch = (params) => __awaiter(void 0, void 0, void 0, function* () {
     const endpoint = (params === null || params === void 0 ? void 0 : params.endpoint) ? params.endpoint : 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi';
-    const query = (params === null || params === void 0 ? void 0 : params.query) || '';
-    const allowedParams = ['id', 'db', 'retmode', 'rettype'];
-    const response = yield axios_1.default.get(`${endpoint}?${Object.keys(params).flatMap(k => allowedParams.includes(k) ? k + '=' + params[k] : []).join('&')}`);
-    let results = Array.isArray(response.data) ? response.data.join('') : response.data;
+    const queries = Array.isArray(params === null || params === void 0 ? void 0 : params.query) ? params === null || params === void 0 ? void 0 : params.query : [params === null || params === void 0 ? void 0 : params.query];
+    params.id = Array.isArray(params === null || params === void 0 ? void 0 : params.id) ? params.id.join(',') : params.id;
+    let allowedParams;
+    let connType = 'get';
+    if (endpoint.match('esearch')) {
+        allowedParams = ['db', 'term', 'retmax', 'retstart'];
+        params = Object.assign(Object.assign({}, params), { retmax: 100000, retmode: 'xml' });
+    }
+    else if (endpoint.match('efetch')) {
+        connType = 'get';
+        allowedParams = ['id', 'db', 'retmode', 'rettype', 'retmax'];
+        const retmode = (params === null || params === void 0 ? void 0 : params.rettype) === 'fasta' || (params === null || params === void 0 ? void 0 : params.rettype) === 'gb' ? 'txt' : 'xml';
+        params = Object.assign(Object.assign({}, params), { retmax: 10000, retmode });
+    }
+    else if (endpoint.match('esummary')) {
+        allowedParams = ['id', 'db', 'retmode', 'rettype', 'retstart', 'version'];
+        params = Object.assign(Object.assign({}, params), { retmax: 10000, retmode: 'xml', version: '2.0' });
+    }
+    let response = '';
+    switch (connType) {
+        case 'post':
+            let postParam = {};
+            Object.keys(params).flatMap(k => allowedParams.includes(k) ? postParam[k] = params[k] : []);
+            response = yield axios_1.default.post(endpoint, postParam);
+            break;
+        case 'get':
+            const q = `${endpoint}?${Object.keys(params).flatMap(k => allowedParams.includes(k) ? k + '=' + params[k] : []).join('&')}`;
+            console.log(q);
+            response = yield axios_1.default.get(q);
+        default:
+            break;
+    }
+    let json = Array.isArray(response.data) ? response.data.join('') : response.data;
     if (params === null || params === void 0 ? void 0 : params.retmode) {
         switch (params.retmode) {
             case 'xml':
@@ -30,21 +99,30 @@ const getEsearch = (params) => __awaiter(void 0, void 0, void 0, function* () {
                     alwaysCreateTextNode: false,
                     attributeNamePrefix: "",
                     textNodeName: "value",
-                    allowBooleanAttributes: true
+                    allowBooleanAttributes: true,
                 });
-                results = parser.parse(results);
+                json = parser.parse(json);
                 break;
             case 'gb':
-                results = (0, genbank_parser_1.default)(results);
+                json = (0, genbank_parser_1.default)(json);
                 break;
             default:
                 break;
         }
     }
-    // https://docs.jsonata.org/simple
-    // if (query !== '') results = jsonata(query).evaluate(results)
-    if (query !== '')
-        results = (0, jsonpath_plus_1.JSONPath)({ path: query, json: results });
-    return results;
+    json = renameKeys(json);
+    const results = [];
+    for (const query of queries) {
+        // https://www.npmjs.com/package/jsonpath-plus
+        let result;
+        if (query !== '') {
+            result = { query, value: (0, jsonata_1.default)(query).evaluate(json) /*simpleJSON(JSONPath({path: query, json})) */ };
+        }
+        else {
+            result = '';
+        }
+        results.push(result);
+    }
+    return simpleJSON(results);
 });
 module.exports = (params) => __awaiter(void 0, void 0, void 0, function* () { return yield getEsearch(params); });

+ 86 - 16
workers/esearch.ts

@@ -1,43 +1,113 @@
 import axios from 'axios'
 import genbankParser from 'genbank-parser'
 import { XMLParser } from 'fast-xml-parser'
-import jsonata from "jsonata"
-import {JSONPath} from 'jsonpath-plus';
+import { JSONPath }  from 'jsonpath-plus';
+import jsonata from 'jsonata';
+import { log } from 'console';
 
+const simpleJSON = (json:any):any => {
+    if (Array.isArray(json)) {
+        if (json.length === 1) { return simpleJSON(json[0]) }
+        else { return json }
+    } else if (typeof json === 'object') {
+        if (Object.keys(json).length === 1 && typeof json[Object.keys(json)[0]] === 'object') { return simpleJSON(json[Object.keys(json)[0]]) }
+        else { return json }
+    } else {
+        return json
+    }
+}
+
+const renameKeys = (json:any):any => {
+    if(Array.isArray(json)) {
+        return json.map(e => renameKeys(e))
+    } else {
+        const newObj:any = {}
+        Object.keys(json).map(key => {
+            let tmp
+            if(typeof json[key] === 'object') {
+                tmp = renameKeys(json[key])
+            } else {
+                tmp = json[key]
+            }
+            newObj[key.replace(/-/g,"_")] = tmp
+        })
+        return newObj
+    }
+}
 
 const getEsearch = async (params: any) => {
     const endpoint = params?.endpoint ? params.endpoint : 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi'
-    const query = params?.query || ''
-    const allowedParams = ['id', 'db', 'retmode', 'rettype']
-    
-    const response = await axios.get(`${endpoint}?${Object.keys(params).flatMap(k => allowedParams.includes(k) ? k + '=' + params[k] : []).join('&')}`)
+    const queries = Array.isArray(params?.query) ? params?.query : [params?.query] 
+    params.id = Array.isArray(params?.id) ? params.id.join(',') : params.id
+   
+    let allowedParams: string[]
+    let connType: string = 'get'
+    if (endpoint.match('esearch')) {
+        allowedParams = ['db', 'term', 'retmax', 'retstart']
+        params = {...params, retmax: 100000, retmode: 'xml'}
+    } else if (endpoint.match('efetch')) {
+        connType = 'get'
+        allowedParams = ['id', 'db', 'retmode', 'rettype', 'retmax']
+        const retmode = params?.rettype === 'fasta' || params?.rettype === 'gb'? 'txt' : 'xml'
+        params = {...params, retmax: 10000, retmode}
+    } else if (endpoint.match('esummary')) {
+        allowedParams = ['id', 'db', 'retmode', 'rettype', 'retstart', 'version']
+        params = {...params, retmax: 10000, retmode: 'xml', version: '2.0'}
+    }
+
+    let response:any = ''
+    switch (connType) {
+        case 'post':
+            let postParam:any = {}
+            Object.keys(params).flatMap(k => allowedParams.includes(k) ? postParam[k] = params[k] : [])
+            response = await axios.post(endpoint, postParam)
+            break;
+        case 'get':
+            const q = `${endpoint}?${Object.keys(params).flatMap(k => allowedParams.includes(k) ? k + '=' + params[k] : []).join('&')}`
+            console.log(q);
+            response = await axios.get(q)
+        default:
+            break;
+    }
     
-    let results = Array.isArray(response.data) ? response.data.join('') : response.data
+    let json = Array.isArray(response.data) ? response.data.join('') : response.data
     if (params?.retmode) {
         switch (params.retmode) {
             case 'xml':
                 const parser = new XMLParser({
-                    ignoreAttributes : false, 
+                    ignoreAttributes: false, 
                     alwaysCreateTextNode: false, 
-                    attributeNamePrefix : "",
+                    attributeNamePrefix: "",
                     textNodeName: "value",
-                    allowBooleanAttributes: true
+                    allowBooleanAttributes: true,
                 })
-                results = parser.parse(results)
+                json = parser.parse(json)
                 break;
             case 'gb':
-                results = genbankParser(results)
+                json = genbankParser(json)
                 break;
             default:
                 break;
         }
     }
 
-    // https://docs.jsonata.org/simple
-    // if (query !== '') results = jsonata(query).evaluate(results)
-    if (query !== '') results = JSONPath({path: query, json: results})
 
-    return results
+    json = renameKeys(json)
+    const results = []
+    
+    
+    for (const query of queries) {
+        // https://www.npmjs.com/package/jsonpath-plus
+        let result:any
+        if (query !== '') {
+            result = {query, value: jsonata(query).evaluate(json)/*simpleJSON(JSONPath({path: query, json})) */}
+        } else {
+            result = ''
+        }
+        results.push(result)
+    }
+    
+    return simpleJSON(results)
 }
 
 module.exports = async (params:any) => await getEsearch(params)