summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--README.md4
-rw-r--r--app.js5
-rw-r--r--benchmark/find.js27
-rw-r--r--benchmark/match-str.js22
-rw-r--r--package-lock.json12
-rw-r--r--package.json1
-rw-r--r--paths.js47
-rw-r--r--pieces/prepare-streams.js5
-rw-r--r--pieces/retro-search.js (renamed from pieces/search.js)5
-rw-r--r--pieces/suggest.js4
-rw-r--r--utils/kb-util.js (renamed from pieces/kb-util.js)8
-rw-r--r--utils/match-util.js (renamed from pieces/match-util.js)0
-rw-r--r--utils/mem-usage.js20
-rw-r--r--utils/url-util.js23
15 files changed, 143 insertions, 41 deletions
diff --git a/.gitignore b/.gitignore
index 3f33deb..1575068 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
node_modules/
data/*
+.env
diff --git a/README.md b/README.md
index e550493..477d0cf 100644
--- a/README.md
+++ b/README.md
@@ -19,3 +19,7 @@ run
npm start
+prepare source for production:
+
+* remove ``/bench`` routes from ``paths.js``
+* remove ``/bench`` folder
diff --git a/app.js b/app.js
index c0ad4f2..aa79f62 100644
--- a/app.js
+++ b/app.js
@@ -2,6 +2,8 @@
const Koa = require('koa');
const { koaBody } = require('koa-body');
+require('dotenv').config();
+
const app = new Koa();
// middleware
@@ -13,4 +15,5 @@ let paths = require('./paths.js');
// use the routes
app.use(paths.routes());
-app.listen(3000);
+// app.listen(3000);
+app.listen(process.env.APP_PORT);
diff --git a/benchmark/find.js b/benchmark/find.js
index cc95a44..2d18657 100644
--- a/benchmark/find.js
+++ b/benchmark/find.js
@@ -1,5 +1,11 @@
+/**
+ * benchmark: find a product in product list
+ * using: for vs forEach vs find
+ */
+
+const microtime = require('microtime');
+
const products = require('../data/products.json');
-var microtime = require('microtime');
var selected = [];
@@ -12,25 +18,32 @@ products.forEach( pr => {
function compare() {
+ let n = 4;
+
var f0 = microtime.nowDouble();
- for(i=0 ; i < 4 ; i++) byFor();
+ for(i=0 ; i < n ; i++) byFor();
var f1 = microtime.nowDouble();
//
var e0 = microtime.nowDouble();
- for(i=0 ; i < 4 ; i++) byEach();
+ for(i=0 ; i < n ; i++) byEach();
var e1 = microtime.nowDouble();
//
var b0 = microtime.nowDouble();
- for(i=0 ; i < 4 ; i++) byFind();
+ for(i=0 ; i < n ; i++) byFind();
var b1 = microtime.nowDouble();
return {
+ n: n,
+
for: f1-f0,
- ifor: byFor(),
+ items_for: byFor(),
+
each: e1-e0,
- ieach: byEach(),
+ items_each: byEach(),
+
find: b1-b0,
- ifind: byFind(),
+ items_find: byFind(),
+
sel: selected,
}
}
diff --git a/benchmark/match-str.js b/benchmark/match-str.js
index 7760b4e..fa802c1 100644
--- a/benchmark/match-str.js
+++ b/benchmark/match-str.js
@@ -1,17 +1,23 @@
-const products = require('../data/products.json');
-const match = require('../pieces/match-util.js');
var microtime = require('microtime');
+const match = require('../utils/match-util.js');
+const memory_usage = require('../utils/mem-usage.js');
+
+const products = require('../data/products.json');
-query = 'solokata';
+// memory_usage.report();
-function run() {
+// test runner
+function run(query) {
var f0 = microtime.nowDouble();
- // for(let i = 0 ; i < 100 ; i++)
- let result = matchQuery(query);
+ let result;
+ // for(let i = 0 ; i < 20 ; i++)
+ result = matchQuery(query);
var f1 = microtime.nowDouble();
+ memory_usage.report();
+
return {
t: f1-f0,
q: query,
@@ -19,7 +25,7 @@ function run() {
}
}
-
+// sumple search implementation
function matchQuery(q) {
var result = [];
@@ -43,4 +49,4 @@ function matchQuery(q) {
}
-module.exports = { run } \ No newline at end of file
+module.exports = { run }
diff --git a/package-lock.json b/package-lock.json
index 7b611b6..dea6a07 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
+ "dotenv": "^16.4.5",
"koa": "^2.15.2",
"koa-body": "^6.0.1",
"koa-router": "^12.0.1",
@@ -447,6 +448,17 @@
"wrappy": "1"
}
},
+ "node_modules/dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
diff --git a/package.json b/package.json
index 2b131cb..2ffe852 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"author": "Geo-Xalkiadakis@Sklavenitis-SA",
"license": "ISC",
"dependencies": {
+ "dotenv": "^16.4.5",
"koa": "^2.15.2",
"koa-body": "^6.0.1",
"koa-router": "^12.0.1",
diff --git a/paths.js b/paths.js
index a2af434..6e5fbef 100644
--- a/paths.js
+++ b/paths.js
@@ -1,16 +1,24 @@
+/**
+ * defines routes
+ * exports router
+ */
+
const Router = require('koa-router');
+const urler = require('./utils/url-util');
-const kb = require('./pieces/kb-util.js');
const data = require('./pieces/prepare-streams');
-const products = require('./data/products.json');
+
const bench = require('./benchmark/find.js');
-const macthStr = require('./benchmark/match-str.js');
+const matchStr = require('./benchmark/match-str.js');
+
// Prefix all routes with: /items
const router = new Router({
// prefix: '/items'
});
+
+
/* simple route example
let items = [
@@ -50,7 +58,6 @@ const router = new Router({
// Routes
-
router.get('/', (ctx, next) => {
ctx.body = {
success: true,
@@ -68,6 +75,7 @@ router.get('/search', (ctx, next) => {
router.get('/search/:title', (ctx, next) => {
// console.log(ctx);
+ const kb = require('./utils/kb-util.js');
let words = kb.keyboardize(kb.clean(ctx.params.title)).split(' ');
ctx.body = {
params: ctx.params,
@@ -93,8 +101,7 @@ router.get('/search/:title', (ctx, next) => {
router.get('/test', (ctx, next) => { // easy test route
// test anything ...
- let result = { success: true, data: [1, 2, 3] };
- ctx.body = result;
+ ctx.body = { params: urler.struct(ctx.request, ctx.url), ctx: ctx }
next();
});
@@ -111,24 +118,30 @@ router.get('/test/do-data', (ctx, next) => { // easy test route
next();
});
-router.get('/test/json', (ctx, next) => { // easy test route
- // test anything ...
- ctx.body = { t: + new Date(), p: products };
- next();
-});
+// benchmark routes;
+// shall be removed from production
+////////////////////////////////////////////////////////////////////////////////
+
+/// router.get('/test/json', (ctx, next) => { // easy test route
+/// // test anything ...
+/// ctx.body = { t: + new Date(), p: products };
+/// next();
+/// });
-router.get('/bench/fe', (ctx, next) => { // easy test route
+router.get('/bench/find', (ctx, next) => { // easy test route
// test anything ...
- // ctx.body = bench.compare();
ctx.body = bench.compare();
next();
});
-router.get('/bench/match', (ctx, next) => { // easy test route
- // test anything ...
+router.get('/bench/match/:title', (ctx, next) => { // easy test route
+ // test anything ... [ query = 'solokata' ]
// ctx.body = bench.compare();
- ctx.body = macthStr.run();
+ ctx.body = matchStr.run(ctx.params.title);
next();
});
-module.exports = router; \ No newline at end of file
+
+// export routes
+
+module.exports = router;
diff --git a/pieces/prepare-streams.js b/pieces/prepare-streams.js
index 4fa0a7e..ee7ba8e 100644
--- a/pieces/prepare-streams.js
+++ b/pieces/prepare-streams.js
@@ -1,8 +1,9 @@
const fs = require('fs');
-const kb = require('./kb-util.js');
-
var request = require('request');
+const kb = require('../utils/kb-util.js');
+
+
// const https = require("https");
diff --git a/pieces/search.js b/pieces/retro-search.js
index 0c05708..ba4d937 100644
--- a/pieces/search.js
+++ b/pieces/retro-search.js
@@ -1,5 +1,6 @@
-const kb = require('./kb-util.js');
-const match = require('./match-util.js');
+const kb = require('../utils/kb-util.js');
+const match = require('../utils/match-util.js');
+
const products = require('../data/products.json');
/** VARIABLES
diff --git a/pieces/suggest.js b/pieces/suggest.js
index a420edd..c0a6e04 100644
--- a/pieces/suggest.js
+++ b/pieces/suggest.js
@@ -1,5 +1,5 @@
-const kb = require('./kb-util.js');
-const match = require('./match-util.js');
+const kb = require('../utils/kb-util.js');
+const match = require('../utils/match-util.js');
var _allowFuzzy = true; // enable|disable fuzzy search
var n = 2; // Ngram base
diff --git a/pieces/kb-util.js b/utils/kb-util.js
index 5441861..aac88f9 100644
--- a/pieces/kb-util.js
+++ b/utils/kb-util.js
@@ -1,3 +1,9 @@
+/**
+ * fast string manipulation utilities
+ * for bi-lingual (EL/EN) words/phrases
+ * based on the keyboard layout
+ */
+
// suplamentary arrays (mostly for cache)
// --- -- -- - - -
@@ -75,8 +81,6 @@ const clean = (txt) => {
// --- -- -- - - -
module.exports = {
- map,
- accented_vowels,
keyboardize,
keyb_array,
sanitizeGR,
diff --git a/pieces/match-util.js b/utils/match-util.js
index a13fddb..a13fddb 100644
--- a/pieces/match-util.js
+++ b/utils/match-util.js
diff --git a/utils/mem-usage.js b/utils/mem-usage.js
new file mode 100644
index 0000000..766a93e
--- /dev/null
+++ b/utils/mem-usage.js
@@ -0,0 +1,20 @@
+/**
+ * memory usage report utility
+ */
+
+const formatMemoryUsage = (data) => `${Math.round(data / 1024 / 1024 * 100) / 100} MB`;
+
+function report() {
+ let memoryData = process.memoryUsage();
+
+ let memoryUsage = {
+ rss: `${formatMemoryUsage(memoryData.rss)} -> Resident Set Size - total memory allocated for the process execution`,
+ heapTotal: `${formatMemoryUsage(memoryData.heapTotal)} -> total size of the allocated heap`,
+ heapUsed: `${formatMemoryUsage(memoryData.heapUsed)} -> actual memory used during the execution`,
+ external: `${formatMemoryUsage(memoryData.external)} -> V8 external memory`,
+ };
+
+ console.log(memoryUsage);
+}
+
+module.exports = { report }
diff --git a/utils/url-util.js b/utils/url-util.js
new file mode 100644
index 0000000..e86ad9b
--- /dev/null
+++ b/utils/url-util.js
@@ -0,0 +1,23 @@
+/**
+ * url utility
+ */
+
+const querystring = require('querystring');
+
+function struct(req, url) {
+ let url_parts = url.split('?');
+ let query = (url_parts.length > 1)
+ ? querystring.decode(url_parts[1])
+ : {};
+ return {
+ method: req.method,
+ host: req.host,
+ path: url_parts[0],
+ query: query
+ }
+}
+
+/**
+ * exports
+ */
+module.exports = { struct } \ No newline at end of file