StrIdx 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2155c54900f595ae954d2074840f425195a66d6bf464e35dc68a1bb10236255c
4
- data.tar.gz: fc2b50bcf6083b806643886a275e2a03ce3267cbd66dd81a0d63f5f68f8e4268
3
+ metadata.gz: f7655b6bd71bca58c86ad607fd197933fc19b97b3ae1c76e322ec0432025dad7
4
+ data.tar.gz: 2421892aa6fe750213d08e2254019d87ce7abb10496cdf1635a61815b8b8b0d7
5
5
  SHA512:
6
- metadata.gz: ac27e251a448f1ca17d4672d12ac165412f2c7fbd71359e77d21f8a8c30521797befe7f2555d181be2af0cace345636558b4a8d93d8e141f707e8b28ffe5687b
7
- data.tar.gz: f8e65efbed5079c0a2e37504aa955e0855d0ef088ad07d1d2566dee6c5f51b79d9ba71ef102e5aaeef8d1b7d548eefa2fab3930e21b7de05b940da882c9b86f3
6
+ metadata.gz: 0a0ed3f51b95b72a553cf97e1a852f63e8b6d1cbbba56fdab55ed5037ef4d658b8649f2cf92d35b5eea4e6657a18a3a1460a3a57069cda0889a1987f5d1611ee
7
+ data.tar.gz: f0d4753ee43cb205fa86468dad92a66644e12cf889d8018283cb421e4a5d670386b8666af64b89d4d475a59f10701de2223c31d03ac5d366f2ee255c77190cf8
data/CMakeLists.txt ADDED
@@ -0,0 +1,27 @@
1
+ cmake_minimum_required(VERSION 3.14)
2
+
3
+ project(my_project)
4
+ # https://github.com/google/googletest/issues/4000
5
+ include(FetchContent)
6
+ FetchContent_Declare(
7
+ googletest
8
+ URL https://github.com/google/googletest/archive/58d77fa8070e8cec2dc1ed015d66b454c8d78850.zip # release-1.12.1
9
+ )
10
+
11
+ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
12
+ FetchContent_MakeAvailable(googletest)
13
+
14
+ enable_testing()
15
+
16
+ add_executable(
17
+ stridx_test
18
+ unittest.cpp
19
+ )
20
+ target_link_libraries(
21
+ stridx_test
22
+ GTest::gtest_main
23
+ )
24
+
25
+ include(GoogleTest)
26
+ gtest_discover_tests(stridx_test)
27
+
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+
data/Makefile CHANGED
@@ -1,7 +1,7 @@
1
1
  all: demo
2
2
 
3
- demo: *.hpp *.cpp
4
- g++ -Wall -O3 -fopenmp -lstdc++ demo.cpp -o demo
3
+ demo: *.hpp *.cpp Makefile
4
+ g++ -Wall -O3 -lstdc++ demo.cpp -o demo
5
5
 
6
6
  clean:
7
7
  rm demo
data/README.md CHANGED
@@ -37,12 +37,58 @@ and candidate is "./drivers/char/hw_random/nomadik-rng.c", then scores are calcu
37
37
  score = score1/(11*11)*0.97 + score1/(11*38)*0.03 = 0.342944
38
38
  ```
39
39
 
40
- # Ruby interface
40
+ # Interfaces
41
+
42
+ ## Commandline
43
+ Install instructions (for Ubuntu Linux):
44
+ ```
45
+ apt update
46
+ apt install ruby ruby-dev build-essential
47
+ gem install StrIdx
48
+ ```
49
+
50
+ Start indexing server (on background):
51
+ ```
52
+ stridx.rb start -- ~/Documents/ ~/Pictures/
53
+ ```
54
+
55
+ Add bash keybindings (Ctrl-t):
56
+ ```
57
+ eval "$(stridx.rb bash)"
58
+ ```
59
+
60
+ Search by pressing <kbd>ctrl</kbd>+<kbd>t</kbd>. Keys: <kbd>up</kbd>, <kbd>down</kbd>, select with <kbd>enter</kbd>
61
+
62
+ ![screencast](https://github.com/SamiSieranoja/stridx/assets/46612258/b2fd4fa2-37ad-4423-bd5f-d54b24ff6df5)
63
+
64
+
65
+ Stop server:
66
+ ```
67
+ stridx.rb stop
68
+ ```
69
+
70
+ Start indexing server (on foreground, to debug):
71
+ ```
72
+ stridx.rb run -- ~/Documents/ ~/Pictures/
73
+ ```
74
+
75
+
76
+ ## Ruby
41
77
  Install:
42
78
  ```
79
+ apt install ruby ruby-dev build-essential
43
80
  gem install StrIdx
44
81
  ```
45
82
 
83
+ Or, for development version:
84
+ ```
85
+ git clone https://github.com/SamiSieranoja/stridx.git
86
+ cd stridx
87
+ cd rubyext; ruby extconf.rb ; make ; cd ..
88
+ gem build stridx.gemspec
89
+ gem install $(ls -1tr StrIdx*gem | tail -n 1)
90
+ ```
91
+
46
92
  Usage example (see test.rb):
47
93
  ```ruby
48
94
  require "stridx"
@@ -58,7 +104,7 @@ for x in lines
58
104
  end
59
105
 
60
106
  idx_time = Time.new
61
- puts "\nIndexing time (#{lines.size} files}): #{(idx_time - t).round(4)} seconds"
107
+ puts "\nIndexing time (#{lines.size} files): #{(idx_time - t).round(4)} seconds"
62
108
 
63
109
  query = "rngnomadriv"
64
110
  res = idx.find(query)
@@ -105,7 +151,7 @@ Search time: 0.0488 seconds
105
151
  ```
106
152
 
107
153
 
108
- # C++ API
154
+ ## C++
109
155
  See demo.cpp
110
156
  ```cpp
111
157
  #include "stridx.hpp"
data/demo.cpp CHANGED
@@ -1,3 +1,12 @@
1
+
2
+ #include <condition_variable>
3
+ #include <functional>
4
+ #include <iostream>
5
+ #include <mutex>
6
+ #include <queue>
7
+ #include <thread>
8
+ #include <algorithm>
9
+
1
10
  #include "stridx.hpp"
2
11
 
3
12
  #include <iostream>
@@ -28,7 +37,7 @@ std::vector<std::string> readLinesFromFile(const std::string &filename) {
28
37
  }
29
38
 
30
39
  int main() {
31
- StringIndex idx;
40
+ StrIdx::StringIndex idx('/'); // Separate directories using unix style "/" char
32
41
  // idx.addStrToIndex("./gdk/x11/gdkasync.c", 0 /*id*/, '/' /*separator*/);
33
42
  // idx.addStrToIndex("./gdk/x11/gdksettings.c", 1, '/');
34
43
  // idx.addStrToIndex("./gdk/x11/gdkx11devicemanager-xi2.h", 2, '/');
@@ -37,26 +46,39 @@ int main() {
37
46
  std::string fn_filePaths = "flist.txt";
38
47
  std::vector<std::string> v_filePaths = readLinesFromFile(fn_filePaths);
39
48
 
49
+ // Launch indexing to be run on background
50
+ cout << "File paths: " << v_filePaths.size() << std::endl;
51
+ cout << "Start indexing in the background" << std::endl;
40
52
  auto start = std::chrono::high_resolution_clock::now();
41
53
  int id = 0;
42
54
  for (const auto &filePath : v_filePaths) {
43
- idx.addStrToIndex(filePath, id, '/' /*dir separator*/);
44
- // idx.addStrToIndex(filePath, id, '\0' /*dir separator*/);
55
+ idx.addStrToIndexThreaded(filePath, id);
45
56
  id++;
46
57
  }
47
-
58
+
59
+ auto idx_time_launch = std::chrono::high_resolution_clock::now();
60
+ std::chrono::duration<double, std::milli> duration_launch = idx_time_launch - start;
61
+ cout << "Indexing launch time (seconds): " << duration_launch.count() / 1000 << "\n";
62
+
63
+ // Wait until indexing has finished
64
+ idx.waitUntilDone();
65
+
48
66
  auto idx_time = std::chrono::high_resolution_clock::now();
49
67
  std::chrono::duration<double, std::milli> duration = idx_time - start;
50
- cout << "Indexing creation time for " << v_filePaths.size() << " file paths (seconds): " << duration.count() / 1000 << "\n";
68
+ cout << "Indexing finished time for " << v_filePaths.size()
69
+ << " file paths (seconds): " << duration.count() / 1000 << "\n";
51
70
 
52
71
  // Find matching filepaths from the index for the query string "rngnomadriv"
53
72
  start = std::chrono::high_resolution_clock::now();
54
73
  std::string query = "rngnomadriv";
74
+ for (int i = 0; i < 99; i++) {
75
+ const vector<pair<float, int>> &results = idx.findSimilar(query, 2);
76
+ }
77
+
55
78
  const vector<pair<float, int>> &results = idx.findSimilar(query, 2);
56
79
  auto search_time = std::chrono::high_resolution_clock::now();
57
80
  duration = search_time - start;
58
- cout << "Search time (seconds): " << duration.count() / 1000
59
- << "\n";
81
+ cout << "Search time for 100 queries (seconds): " << duration.count() / 1000 << "\n";
60
82
 
61
83
  int i = 0;
62
84
  std::cout << "query string: " << query << "\n";
@@ -73,4 +95,4 @@ int main() {
73
95
  }
74
96
 
75
97
  // Compile:
76
- // g++ -Wall -Wno-unused-variable -O3 -fopenmp -lstdc++ demo.cpp -o demo
98
+ // g++ -Wall -Wno-unused-variable -O3 -lstdc++ demo.cpp -o demo
data/exe/stridx.rb ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__) + "/.."
4
+
5
+ if ARGV[0] == "tty"
6
+ require "stridx-tty.rb"
7
+ StrIdxTTY.run
8
+ elsif ARGV[0] == "bash"
9
+ puts %q/
10
+ bind -m emacs-standard '"\er": redraw-current-line';
11
+ bind -m emacs-standard '"\C-t": " \C-b\C-k \C-u`stridx.rb tty`\e\C-e\er\C-a\C-y\C-h\C-e\e \C-y\ey\C-x\C-x\C-f"'
12
+ /
13
+ else
14
+ require "daemons"
15
+ Daemons.run(File.dirname(__FILE__) + "/../runserver.rb")
16
+ end
data/gem_install ADDED
@@ -0,0 +1,4 @@
1
+ gem uninstall --force -x StrIdx
2
+ gem build stridx.gemspec
3
+ gem install $(ls -1tr StrIdx*gem | tail -n 1)
4
+
data/py_example.py ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env python
2
+
3
+ from stridx import StringIndex
4
+ e=StringIndex()
5
+ e.set_value(3)
6
+ e.add("./rust/alloc/vec/spec_extend.rs",0)
7
+ e.add("./virt/kvm/dirty_ring.c",1)
8
+ e.add("./Documentation/staging/static-keys.rst",2)
9
+ e.add("./Documentation/staging/lzo.rst",3)
10
+
11
+
12
+
13
+ results = e.find("rstalloc")
14
+ for x in results:
15
+ print(x)
16
+
17
+ # print(e.get_value())
18
+
data/py_interf.cpp ADDED
@@ -0,0 +1,182 @@
1
+
2
+ #include <stdio.h>
3
+ #include <limits.h>
4
+ #include <cstring>
5
+ #include <pthread.h>
6
+
7
+ #include <stdio.h>
8
+ #include <iostream>
9
+ #include <string>
10
+ #include <vector>
11
+ #include <cfloat>
12
+ #include <cmath>
13
+ #include <bits/stdc++.h>
14
+
15
+ using std::ios;
16
+ using std::sort;
17
+ using std::string;
18
+ using std::vector;
19
+
20
+ #include <Python.h>
21
+ #include <cstring>
22
+
23
+ #include "stridx.hpp"
24
+
25
+ extern "C" {
26
+
27
+ // Define a structure for the custom object
28
+ typedef struct {
29
+ PyObject_HEAD int value;
30
+ StrIdx::StringIndex *idx;
31
+ } StrIdxObject;
32
+
33
+ // Method to allocate memory for the object
34
+ static PyObject *StrIdxObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
35
+ StrIdxObject *self;
36
+
37
+ self = (StrIdxObject *)type->tp_alloc(type, 0);
38
+ if (self != NULL) {
39
+ self->value = 0;
40
+ self->idx = new StrIdx::StringIndex();
41
+ }
42
+
43
+ return (PyObject *)self;
44
+ }
45
+
46
+ // Method to deallocate memory for the object
47
+ static void StrIdxObject_dealloc(StrIdxObject *self) { Py_TYPE(self)->tp_free((PyObject *)self); }
48
+
49
+ // Method to set the value of the object
50
+ static PyObject *StrIdxObject_set_value(StrIdxObject *self, PyObject *args) {
51
+ int value;
52
+
53
+ if (!PyArg_ParseTuple(args, "i", &value)) {
54
+ return NULL;
55
+ }
56
+
57
+ self->value = value;
58
+
59
+ Py_INCREF(Py_None);
60
+ return Py_None;
61
+ }
62
+
63
+ static PyObject *StrIdxObject_add(StrIdxObject *self, PyObject *args) {
64
+ char *value;
65
+ int file_id;
66
+ std::string str;
67
+ if (!PyArg_ParseTuple(args, "si", &value, &file_id)) {
68
+ return NULL;
69
+ }
70
+ str = value;
71
+
72
+ printf("char[]*: %s %i\n", value, file_id);
73
+ self->idx->addStrToIndex(str, file_id);
74
+ // self->idx->addStrToIndexThreaded(str, file_id);
75
+ Py_INCREF(Py_None);
76
+ return Py_None;
77
+ }
78
+
79
+ static PyObject *StrIdxObject_find(StrIdxObject *self, PyObject *args) {
80
+ char *value;
81
+ std::string str;
82
+ if (!PyArg_ParseTuple(args, "s", &value)) {
83
+ return NULL;
84
+ }
85
+ str = value;
86
+
87
+ printf("char*: %s\n", value);
88
+ const std::vector<std::pair<float, int>> &results = self->idx->findSimilar(str, 2);
89
+
90
+ int limit = 15;
91
+ int i = 0;
92
+
93
+ printf("res=%d\n", results.size());
94
+ if (results.size() < limit) {
95
+ limit = results.size();
96
+ }
97
+ PyObject *pyarr = PyList_New(limit);
98
+
99
+ for (const auto &[score,fileId] : results) {
100
+ PyObject *arr2 = PyList_New(2);
101
+ // PyList_SetItem(arr2, 0, Py_BuildValue("i", res.second));
102
+ // PyList_SetItem(arr2, 1, Py_BuildValue("d", res.first));
103
+ PyList_SetItem(arr2, 0, Py_BuildValue("i", fileId));
104
+ PyList_SetItem(arr2, 1, Py_BuildValue("d", score));
105
+ PyList_SetItem(pyarr, i, arr2);
106
+ i++;
107
+ if (i >= limit) {
108
+ break;
109
+ }
110
+ }
111
+
112
+ // Py_INCREF(Py_None);
113
+ return pyarr;
114
+ }
115
+
116
+ // Method to get the value of the object
117
+ static PyObject *StrIdxObject_get_value(StrIdxObject *self) {
118
+ return PyLong_FromLong(self->value);
119
+ }
120
+
121
+ // Define methods of the class
122
+ static PyMethodDef StrIdxObject_methods[] = {
123
+ {"set_value", (PyCFunction)StrIdxObject_set_value, METH_VARARGS,
124
+ "Set the value of the object"},
125
+ {"add", (PyCFunction)StrIdxObject_add, METH_VARARGS, "Set the value of the object"},
126
+ {"find", (PyCFunction)StrIdxObject_find, METH_VARARGS, "Find similar strings"},
127
+ {"get_value", (PyCFunction)StrIdxObject_get_value, METH_NOARGS, "Get the value of the object"},
128
+ {NULL} /* Sentinel */
129
+ };
130
+
131
+ // Define the type object for the class
132
+ static PyTypeObject StrIdxType = {
133
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "stridx.StrIdx",
134
+ .tp_basicsize = sizeof(StrIdxObject),
135
+ .tp_dealloc = (destructor)StrIdxObject_dealloc,
136
+ .tp_doc = PyDoc_STR("Fuzzy string index"),
137
+ .tp_methods = StrIdxObject_methods,
138
+ .tp_new = StrIdxObject_new,
139
+ // .tp_repr = (reprfunc)myobj_repr,
140
+ };
141
+
142
+ // PyVarObject_HEAD_INIT(NULL, 0)
143
+ // .tp_name = "stridx.StrIdx",
144
+ // .tp_doc = "StrIdx class",
145
+ // .tp_basicsize = sizeof(StrIdxObject),
146
+ // .tp_itemsize = 0,
147
+ // .tp_flags = Py_TPFLAGS_DEFAULT,
148
+ // .tp_new = StrIdxObject_new,
149
+ // .tp_dealloc = (destructor)StrIdxObject_dealloc,
150
+ // .tp_methods = StrIdxObject_methods,
151
+ // };
152
+
153
+
154
+ // Define python accessible methods
155
+ static PyMethodDef StrIdxMethods[] = {
156
+ {NULL, NULL, 0, NULL}};
157
+
158
+ static struct PyModuleDef moduledef = {
159
+ PyModuleDef_HEAD_INIT, "stridx", NULL, -1, StrIdxMethods, NULL, NULL, NULL, NULL};
160
+
161
+ PyMODINIT_FUNC PyInit_stridx(void) {
162
+ PyObject *m;
163
+ m = PyModule_Create(&moduledef);
164
+
165
+ // Initialize the type object
166
+ if (PyType_Ready(&StrIdxType) < 0) {
167
+ return NULL;
168
+ }
169
+
170
+ Py_INCREF(&StrIdxType);
171
+ if (PyModule_AddObject(m, "StringIndex", (PyObject *)&StrIdxType) < 0) {
172
+ Py_DECREF(&StrIdxType);
173
+ Py_DECREF(m);
174
+ return NULL;
175
+ }
176
+
177
+ if (!m) {
178
+ return NULL;
179
+ }
180
+ return m;
181
+ }
182
+ } // END extern "C"
data/rubyext/extconf.rb CHANGED
@@ -1,15 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
- #
3
2
 
4
3
  require 'mkmf'
5
4
 
6
5
  module_name = "stridx"
7
6
  extension_name = 'stridx'
8
7
 
9
- $CXXFLAGS << " -Wall -Wno-unused-variable -O3 -fopenmp"
8
+ $CXXFLAGS << " -Wall -Wno-unused-variable -O3"
10
9
 
11
10
  have_library( 'stdc++');
12
- have_library( 'gomp' );
13
11
 
14
12
  dir_config(extension_name) # The destination
15
13
  create_makefile(extension_name) # Create Makefile
@@ -7,7 +7,7 @@
7
7
 
8
8
  extern "C" {
9
9
 
10
- void str_idx_free(void *data) { delete (StringIndex *)data; }
10
+ void str_idx_free(void *data) { delete (StrIdx::StringIndex *)data; }
11
11
 
12
12
  // Wrap StringIndex class inside a ruby variable
13
13
  static const rb_data_type_t str_idx_type = {
@@ -26,7 +26,7 @@ static const rb_data_type_t str_idx_type = {
26
26
  };
27
27
 
28
28
  VALUE str_idx_alloc(VALUE self) {
29
- void *data = new StringIndex();
29
+ void *data = new StrIdx::StringIndex();
30
30
  return TypedData_Wrap_Struct(self, &str_idx_type, data);
31
31
  }
32
32
 
@@ -36,18 +36,27 @@ VALUE StringIndexAddSegments(VALUE self, VALUE str, VALUE fileId) {
36
36
 
37
37
  void *data;
38
38
  TypedData_Get_Struct(self, int, &str_idx_type, data);
39
- ((StringIndex *)data)->addStrToIndex(s1, fid);
39
+ // ((StringIndex *)data)->addStrToIndex(s1, fid);
40
+ ((StrIdx::StringIndex *)data)->addStrToIndexThreaded(s1, fid);
40
41
 
41
42
  return self;
42
43
  }
43
44
 
45
+ VALUE StringIndexWaitUntilDone(VALUE self) {
46
+ void *data;
47
+ TypedData_Get_Struct(self, int, &str_idx_type, data);
48
+ ((StrIdx::StringIndex *)data)->waitUntilDone();
49
+ return self;
50
+ }
51
+
52
+
44
53
  VALUE StringIndexFind(VALUE self, VALUE str) {
45
54
  VALUE ret;
46
55
  std::string s1 = StringValueCStr(str);
47
56
 
48
57
  void *data;
49
58
  TypedData_Get_Struct(self, int, &str_idx_type, data);
50
- StringIndex *idx = (StringIndex *)data;
59
+ StrIdx::StringIndex *idx = (StrIdx::StringIndex *)data;
51
60
 
52
61
  ret = rb_ary_new();
53
62
  const std::vector<std::pair<float, int>> &results = idx->findSimilar(s1, 2);
@@ -80,7 +89,7 @@ VALUE StringIndexSetDirSeparator(VALUE self, VALUE str) {
80
89
 
81
90
  void *data;
82
91
  TypedData_Get_Struct(self, int, &str_idx_type, data);
83
- StringIndex *idx = (StringIndex *)data;
92
+ StrIdx::StringIndex *idx = (StrIdx::StringIndex *)data;
84
93
  idx->setDirSeparator(c);
85
94
 
86
95
  return self;
@@ -93,8 +102,12 @@ void Init_stridx(void) {
93
102
 
94
103
  rb_define_alloc_func(classStringIndex, str_idx_alloc);
95
104
  rb_define_method(classStringIndex, "add", StringIndexAddSegments, 2);
105
+ rb_define_method(classStringIndex, "waitUntilDone", StringIndexWaitUntilDone, 0);
96
106
  rb_define_method(classStringIndex, "find", StringIndexFind, 1);
107
+
97
108
  rb_define_method(classStringIndex, "setDirSeparator", StringIndexSetDirSeparator, 1);
109
+
110
+
98
111
  }
99
112
 
100
113
  } // End extern "C"
data/runserver.rb ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift File.dirname(__FILE__)
3
+
4
+ require "server.rb"
5
+ # StrIdx::Server.start ARGV, daemonize: true
6
+ StrIdx::Server.start ARGV
7
+
data/server.rb ADDED
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "socket"
4
+ require "stridx"
5
+
6
+ module StrIdx
7
+ class Server
8
+ def recursively_find_files(directories)
9
+ filelist = []
10
+
11
+ for d in directories
12
+ filelist = filelist + Dir.glob("#{d}/**/*").select { |e|
13
+ File.file?(e)
14
+ # File.file?(e) or File.directory?(e)
15
+ }
16
+ end
17
+ return filelist
18
+ end
19
+
20
+ def self.start(dir_list, daemonize: false)
21
+ Server.new(dir_list, daemonize: daemonize)
22
+ end
23
+
24
+ def self.stop
25
+ sock_dir = File.expand_path("~/.stridx")
26
+ sockfn = "#{sock_dir}/sock"
27
+ client = UNIXSocket.new(sockfn)
28
+ client.puts "stop"
29
+ response = client.recv(200 * 200)
30
+ client.close
31
+ end
32
+
33
+ def initialize(dir_list, daemonize: false)
34
+ idx = StrIdx::StringIndex.new
35
+ idx.setDirSeparator("/")
36
+
37
+ t = Time.new
38
+
39
+ dirs = dir_list.select { |x| File.directory?(x) }
40
+ puts "Scanning files in directories:#{dirs.join(",")}"
41
+ flist = recursively_find_files(dirs)
42
+
43
+ i = 0
44
+ for x in flist
45
+ idx.add(x, i)
46
+ i += 1
47
+ end
48
+
49
+ idx.waitUntilDone()
50
+ idx_time = Time.new
51
+ puts "\nIndexing time (#{flist.size} files): #{(idx_time - t).round(4)} seconds"
52
+
53
+ sock_dir = File.expand_path("~/.stridx")
54
+ Dir.mkdir(sock_dir) if !Dir.exist?(sock_dir)
55
+ sockfn = "#{sock_dir}/sock"
56
+ File.unlink(sockfn) if File.exist?(sockfn)
57
+
58
+ puts "Indexing done, starting server"
59
+ if (daemonize)
60
+ require "daemons"
61
+ Daemons.daemonize
62
+ # exit if fork() # Daemonize
63
+ end
64
+
65
+ # exit if fork() # Daemonize
66
+ # $PROGRAM_NAME = "stridx-daemon"
67
+
68
+ t = Thread.new {
69
+ serv = UNIXServer.new(sockfn)
70
+
71
+ loop do
72
+ # Accept a new client connection
73
+ client = serv.accept
74
+
75
+ # puts "Client connected!"
76
+
77
+ # Read data from the client
78
+ data = client.recv(1024)
79
+
80
+ if data.match(/^stop$/)
81
+ puts "Got stop signal. Shutting down server."
82
+ client.close
83
+ break
84
+ end
85
+
86
+ # puts "Received from client: #{data}"
87
+ if data.match(/^find:(.*)/)
88
+ query = Regexp.last_match(1)
89
+ res = idx.find(query)
90
+ response = res.collect { |x| flist[x[0]] }.join("\n")
91
+
92
+ # Send a response back to the client
93
+ client.puts response
94
+ end
95
+ # Close the client connection
96
+ client.close
97
+ end
98
+ }
99
+
100
+ t.join
101
+ end
102
+ end
103
+ end
data/setup.py ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python
2
+ import numpy
3
+
4
+ import setuptools
5
+ from setuptools import setup, Extension
6
+
7
+ __version__ = "0.1"
8
+
9
+ cargs = ['-fpermissive']
10
+
11
+
12
+ with open('README.md', 'r', encoding='utf-8') as f:
13
+ long_description = f.read()
14
+
15
+ module1 = Extension('stridx', sources=['py_interf.cpp'], include_dirs=['.'], extra_compile_args=cargs,
16
+ language="c++",
17
+ )
18
+
19
+ ext_modules = [module1]
20
+
21
+ setup(
22
+ name='stridx',
23
+ version='1.0',
24
+ setup_requires=['wheel'],
25
+ python_requires='>=3',
26
+ provides=['stridx'],
27
+ description='Fast fuzzy string similarity search and indexing (for filenames) ',
28
+ long_description=long_description,
29
+ long_description_content_type='text/markdown',
30
+ ext_modules=[module1]
31
+ )
32
+
Binary file