Open Travel Request Parser
Table of contents generated with markdown-toc
OpenTREP aims at providing a clean API, and the corresponding C++ implementation, for parsing travel-/transport-focused requests. It powers the https://transport-search.org Web site (as well as its newer version, https://www2.transport-search.org).
OpenTREP uses Xapian (https://www.xapian.org) for the Information Retrieval part, on freely available transport-/travel-related data (e.g., country names and codes, city names and codes, airline names and codes, etc), mainly to be found in the OpenTravelData (OPTD) project: http://github.com/opentraveldata/opentraveldata/tree/master/opentraveldata
OpenTREP exposes a simple, clean and object-oriented, API. For instance,
the
OPENTREP::interpretTravelRequest()
method:
As an example, the travel request
Washington DC Beijing Monday a/r +AA -UA 1 week 2 adults 1 dog
would yield
the following list:
The output may then be used by other systems, for instance to book the corresponding travel, or to visualize it on a map and calendar and to share it with others.
Note that the current version of OpenTREP recognizes only geographical POR
(points of reference), whatever their number in the request. For instance,
the request lviv rivne jitomir kbp kharkiv dnk ods lwo
yields the
following list of POR: LWO
, RWN
, ZTR
, KBP
, HRK
, DNK
,
ODS
and LWO
again.
See
that request in action on the transport-search.org site
or through the API
(enable JSONView
or similar for a more confortable reading).
OpenTREP also deals with transport-related requests. For instance,
cnshg deham nlrtm uslbg brssz cnshg
correspond to a world tour
of famous ports:
The underlying data for the POR is the
OpenTravelData optd_por_public_all.csv
file.
A good complementary tool is
GeoBase,
a Python-based software able to access any travel-related data source.
OpenTREP makes an extensive use of existing open-source libraries for increased functionality, speed and accuracy. In particular the Boost (C++ Standard Extensions), Xapian and SOCI libraries are used.
Docker images provide ready-to-use environments, and are available on Docker Cloud and Quay.io:
$ docker pull opentrep/search-travel:legacy # for Docker.io
$ docker pull quay.io/trep/opentrep # for Quay.io
$ docker run --rm -it opentrep/search-travel:legacy bash
See https://github.com/trep/opentrep/tree/master/gui/legacy for more details.
General purpose Docker images for C++/Python development are also available from Docker Cloud. Those Docker images allow to develop on the major Linux distributions, i.e., CentOS, Debian and Ubuntu.
$ docker pull cpppythondevelopment/base:centos8
$ docker run -t cpppythondevelopment/base:centos8 bash
[build@2..c ~]$ $ mkdir -p ~/dev/geo && cd ~/dev/geo
[build@2..c geo]$ git clone https://github.com/trep/opentrep.git
[build@2..c geo]$ cd opentrep && mkdir build && cd build
[build@2..c build (master)]$ cmake3 -DCMAKE_INSTALL_PREFIX=${HOME}/dev/deliveries/opentrep-99.99.99 -DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF -DLIB_SUFFIX= ..
$ docker pull cpppythondevelopment/base:centos7
$ docker run -t cpppythondevelopment/base:centos7 bash
[build@2..c ~]$ $ mkdir -p ~/dev/geo && cd ~/dev/geo
[build@2..c geo]$ git clone https://github.com/trep/opentrep.git
[build@2..c geo]$ cd opentrep && mkdir build && cd build
[build@2..c build (master)]$ cmake3 -DCMAKE_INSTALL_PREFIX=${HOME}/dev/deliveries/opentrep-99.99.99 -DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF -DLIB_SUFFIX= ..
$ docker pull cpppythondevelopment/base:ubuntu2004
$ docker run -t cpppythondevelopment/base:ubuntu2004 bash
[build@2..c ~]$ $ mkdir -p ~/dev/geo && cd ~/dev/geo
[build@2..c geo]$ git clone https://github.com/trep/opentrep.git
[build@2..c geo]$ cd opentrep && mkdir build && cd build
[build@2..c build (master)]$ cmake -DCMAKE_INSTALL_PREFIX=${HOME}/dev/deliveries/opentrep-99.99.99 -DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF -DLIB_SUFFIX= ..
$ docker pull cpppythondevelopment/base:ubuntu1804
$ docker run -t cpppythondevelopment/base:ubuntu1804 bash
[build@2..c ~]$ $ mkdir -p ~/dev/geo && cd ~/dev/geo
[build@2..c geo]$ git clone https://github.com/trep/opentrep.git
[build@2..c geo]$ cd opentrep && mkdir build && cd build
[build@2..c build (master)]$ cmake -DCMAKE_INSTALL_PREFIX=${HOME}/dev/deliveries/opentrep-99.99.99 -DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF -DLIB_SUFFIX= ..
$ docker pull cpppythondevelopment/base:debian10
$ docker run -t cpppythondevelopment/base:debian10 bash
[build@2..c ~]$ $ mkdir -p ~/dev/geo && cd ~/dev/geo
[build@2..c geo]$ git clone https://github.com/trep/opentrep.git
[build@2..c geo]$ cd opentrep && mkdir build && cd build
[build@2..c build (master)]$ cmake -DCMAKE_INSTALL_PREFIX=${HOME}/dev/deliveries/opentrep-99.99.99 -DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF -DLIB_SUFFIX= ..
$ docker pull cpppythondevelopment/base:debian9
$ docker run -t cpppythondevelopment/base:debian9 bash
[build@2..c ~]$ $ mkdir -p ~/dev/geo && cd ~/dev/geo
[build@2..c geo]$ git clone https://github.com/trep/opentrep.git
[build@2..c geo]$ cd opentrep && mkdir build && cd build
[build@2..c build (master)]$ cmake -DCMAKE_INSTALL_PREFIX=${HOME}/dev/deliveries/opentrep-99.99.99 -DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF -DLIB_SUFFIX= ..
[build@2..c build (master)]$ make install
[build@2..c build (master)]$ ./opentrep/opentrep-indexer
[build@2..c build (master)]$ ./opentrep/opentrep-searcher -q "nice san francisco"
Since OpenTREP has been approved as an official package of Fedora/CentOS/RedHat (see the review request on Bugzilla for further details), just use DNF (or Yum for the older distributions):
$ dnf -y install opentrep opentrep-doc
export platform="$(uname | tr '[:upper:]' '[:lower:]')"
export architecture="$(uname -m|sed 's/x86_/amd/')"
The GitHub repository may be cloned as following:
$ mkdir -p ~/dev/geo && cd ~/dev/geo
$ git clone https://github.com/trep/opentrep.git
$ cd opentrep
$ git checkout master
GitHub generates tar-balls on the fly for every tagged release. For instance:
$ wget https://github.com/trep/opentrep/archive/opentrep-0.07.15.tar.gz
Note that SourceForge also stores some older archived tar-balls.
The following packages may be needed (Fedora/RedHat/CentOS names on the left hand side, Debian/Ubuntu names on the right hand side; names for other Linux distributions may vary):
cmake
(or cmake3
on CentOS)gcc-c++
/ gcc
, g++
boost-devel
(or boost169-devel
on CentOS) / libboost-all-dev
xapian-core-devel
/ libxapian-dev
python-devel
/ python
, libpython-dev
libicu-devel
/ libicu-dev
soci-mysql-devel
, soci-sqlite3-devel
/ SOCI needs to be installed from
the sources on Debian, Ubuntu and MacOS (see the dedicated section below)sqlite3-devel
/ sqlite3
, libsqlite3-dev
mariadb-devel
/ libmariadb-dev
, libmysql++-dev
protobuf-devel
, protobuf-compiler
/ libprotobuf-dev
, protobuf-compiler
readline-devel
/ libreadline-dev
, libncurses5-dev
ghostscript
doxygen
tetex-latex
/ texlive-latex-recommended
rpm-build
For instance, the following subsections show respective installation commands for a few famous Linux distributions.
$ dnf -y install git-all bash-completion gcc-c++ cmake boost-devel \
xapian-core-devel soci-mysql-devel soci-sqlite3-devel readline-devel \
sqlite-devel mariadb-devel libicu-devel protobuf-devel protobuf-compiler \
autoconf automake libtool
$ dnf -y install python-devel python-pip
$ dnf -y install python3-protobuf boost-python3-devel
$ dnf -y install doxygen ghostscript "tex(latex)"
$ yum -y install dnf
$ dnf -y install git-all bash-completion gcc-c++ cmake boost169-devel \
xapian-core-devel soci-mysql-devel soci-sqlite3-devel readline-devel \
sqlite-devel mariadb-devel libicu-devel protobuf-devel protobuf-compiler \
autoconf automake libtool
$ dnf -y install python3-protobuf boost169-python3-devel
$ dnf -y install python39 python39-devel
$ dnf -y install python3 python3-devel
$ dnf -y install doxygen ghostscript "tex(latex)"
$ apt-get -y install locales && locale-gen "en_US.UTF-8"
$ apt-get -y install zlib1g-dev libbz2-dev lsb-release libgmp-dev \
libgmp-dev gcc g++ clang cppcheck cmake libboost-all-dev libxapian-dev \
graphviz libreadline-dev libncurses5-dev libczmq-dev libzmq3-dev \
libssl-dev libffi-dev sqlite3 libsqlite3-dev libmariadb-dev \
libmysql++-dev postgresql-server-dev-all libicu-dev \
libprotobuf-dev protobuf-compiler
$ apt-get -y install python3 libpython3-dev python3-pip
$ apt-get -y install doxygen ghostscript texlive-latex-recommended
$ brew install boost boost-python3 cmake libedit \
xapian sqlite mysql mysql-client icu4c protobuf protobuf-c doxygen
$ brew install homebrew/portable-ruby/portable-readline
python@3.12
(Python 3.12.0 as of May 2023)python@3.11
(Python 3.11.3 as of May 2023)python@3.10
(Python 3.10.11 as of May 2023)python@3.9
(Python 3.9.16 as of May 2023)python@3.8
(Python 3.8.16 as of May 2023)python@3.8
Homebrew package).
As a reminder, on MacOS with Homebrew, a way to get the details is:
$ brew info python@3.12
python@3.12: stable 3.12.0 (bottled)
$ brew info python@3.11
python@3.11: stable 3.11.3 (bottled)
$ brew info python@3.10
python@3.10: stable 3.10.11 (bottled)
$ brew info python@3.9
python@3.9: stable 3.9.16 (bottled)
$ brew info python@3.8
python@3.8: stable 3.8.16 (bottled)
$ sudo mkdir -p /usr/local/Cellar/python
$ sudo chown -R $USER /usr/local/Cellar/python
$ ln -s /usr/local/Cellar/python@3.12/3.12.0 /usr/local/Cellar/python/3.12.0
$ ln -s /usr/local/Cellar/python@3.11/3.11.3 /usr/local/Cellar/python/3.11.3
$ ln -s /usr/local/Cellar/python@3.10/3.10.11 /usr/local/Cellar/python/3.10.11
$ ln -s /usr/local/Cellar/python@3.9/3.9.16 /usr/local/Cellar/python/3.9.16
$ ln -s /usr/local/Cellar/python@3.8/3.8.16 /usr/local/Cellar/python/3.8.16
$ ls -lFh /usr/local/Cellar/python/
total 0
lrwxr-xr-x 1 user staff 34B Jan 9 21:14 3.8.11@ -> /usr/local/Cellar/python@3.8/3.8.11
lrwxr-xr-x 1 user staff 34B Jan 9 21:14 3.9.6@ -> /usr/local/Cellar/python@3.9/3.9.6
$ sudo unlink /usr/local/Cellar/python/3.8.7
$ ls -lFh /usr/local/Frameworks/Python.framework/Versions/Current
lrwxr-xr-x 1 user staff 79B Oct 13 12:01 /usr/local/Frameworks/Python.framework/Versions/Current@ -> ../../../Cellar/python@3.10/3.10.11/Frameworks/Python.framework/Versions/Current
$ ls -lFh /usr/local/Frameworks/Python.framework/Versions/3.10
lrwxr-xr-x 1 user staff 76B Oct 13 12:00 /usr/local/Frameworks/Python.framework/Versions/3.10@ -> ../../../Cellar/python@3.10/3.10.11/Frameworks/Python.framework/Versions/3.10
$ ls -lFh /usr/local/Frameworks/Python.framework/Versions/3.11
lrwxr-xr-x 1 user staff 76B Nov 30 17:37 /usr/local/Frameworks/Python.framework/Versions/3.11@ -> ../../../Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11
$ ls -lFh /usr/local/Frameworks/Python.framework/Versions/3.9
lrwxr-xr-x 1 darnaud staff 75B Oct 13 12:01 /usr/local/Frameworks/Python.framework/Versions/3.9@ -> ../../../Cellar/python@3.9/3.9.16/Frameworks/Python.framework/Versions/3.9
$ sudo chown -R $USER /usr/local/Frameworks/Python.framework
$ unlink /usr/local/Frameworks/Python.framework/Versions/3.11
$ ln -s /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11 /usr/local/Frameworks/Python.framework/Versions/3.11
$ unlink /usr/local/Frameworks/Python.framework/Versions/Current
$ ln -s /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11 /usr/local/Frameworks/Python.framework/Versions/Current
$ ls -lFh /usr/local/Cellar/python/
total 0
lrwxr-xr-x 1 user admin 34B Jan 9 21:14 3.10.1@ -> /usr/local/Cellar/python@3.10/3.10.1
lrwxr-xr-x 1 user admin 34B Jan 9 21:14 3.9.9@ -> /usr/local/Cellar/python@3.9/3.9.9
lrwxr-xr-x 1 user admin 34B Jan 9 21:14 3.8.12@ -> /usr/local/Cellar/python@3.8/3.8.12
$ ls -lFh /usr/local/Frameworks/Python.framework/Versions/
total 0
lrwxr-xr-x 1 user staff 75B Jan 9 04:01 3.9@ -> ../../../Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9
lrwxr-xr-x 1 user staff 79B Jan 9 04:01 Current@ -> ../../../Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/Current
libpython
Python library. As of July 2020, it seems to no longer
be the case. As a matter of fact, as stated in the
What’s new documentation of Python 3.8:
On Unix, C extensions are no longer linked to libpython except on Android and Cygwin. It is now possible for a statically linked Python to load a C extension built using a shared library Python. (Contributed by Victor Stinner in bpo-21536.).
The rationale is that most of the C extensions (including OpenTREP
Python extension and Boost.Python) are meant to be loaded by the Python
interpreter, which brings its own Python library (libpython
).
So, if the C extensions are linked against libpython
themselves,
it is highly probable that the versions of both those libpython
libraries (the one integrated with the Python interpreter and
the one linked with the C extension) would differ.
libpython
) is progressing slowly, and highly dependent on the
C extensions and the platforms. For instance:
libpython
.
$ brew info boost-python3
boost-python3: stable 1.80.0 (bottled), HEAD
/usr/local/Cellar/boost-python3/1.80.0_1 (472 files, 17.7MB) *
$ ls -lFh /usr/local/Cellar/boost-python3/1.80.0_1/lib/libboost_python311.dylib
-r--r--r-- 1 user staff 403K Nov 14 11:27 /usr/local/Cellar/boost-python3/1.80.0_1/lib/libboost_python311.dylib
$ otool -L /usr/local/Cellar/boost-python3/1.80.0_1/lib/libboost_python311.dylib
/usr/local/Cellar/boost-python3/1.80.0_1/lib/libboost_python311.dylib:
/usr/local/opt/boost-python3/lib/libboost_python311.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.23.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
The OpenTREP Python extension itself has adopted that change with version 0.07.7 release at the end of May 2020.
$ brew install icu4c
Follow the instructions on Boost helper documentation on GitHub to install Python and Boost on some platforms, including MacOS.
On CentOS, the version of Boost is often outdated, for instance Boost 1.53 on CentOS 7. It may have adversarial effects, for instance on CentOS 7, where Python 3 libraries have been upgraded from Python 3.4 to Python 3.6, but where Boost 1.53 Python libraries have not been upgraded accordingly, leading for the least to linking errors.
Hopefully, EPEL provides more recent Boost releases, for instance Boost 1.69 on RHEL/CentOS 7.
Those additional specific Boost packages may be installed in parallel to the official Boost packages. CMake has however to be made aware of that additional Boost package and, equally importantly, of its location on the file-system.
Example of additional CMake configuration variables for Boost 1.69 on CentOS 7:
$ cmake3 [...] \
-DBOOST_LIBRARYDIR=/usr/lib64/boost169 \
-DBOOST_INCLUDEDIR=/usr/include/boost169 \
-DBoost_ADDITIONAL_VERSIONS="1.69 1.69.0" \
[...]
On CentOS and Fedora, since the author of this package (OpenTREP) is also the official maintainer of the SOCI package, that latter is usually up-to-date
On Debian, Ubuntu and MacOS however, SOCI must be built from the sources. The following shows how to do that on MacOS (on Debian/Ubuntu, one can have a look at the part installing SOCI on the C++/Python Docker files)
Download and prepare SOCI:
$ sudo mkdir -p /opt/soci && sudo chown -R ${USER} /opt/soci
$ git clone https://github.com/SOCI/soci.git /opt/soci/socigit
$ mkdir -p /opt/soci/socigit/build/head
$ pushd /opt/soci/socigit/build/head
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DSOCI_CXX11=ON -DSOCI_TESTS=OFF ../..
$ make
$ sudo make install
$ popd
$ wget https://github.com/trep/opentrep/raw/master/ci-scripts/soci-debian-cmake.patch -O /opt/soci/soci-debian-cmake.patch
$ pushd /opt/soci/socigit
$ patch -p1 < ../soci-debian-cmake.patch
$ popd
$ mkdir -p /opt/soci/socigit/build/head
$ pushd /opt/soci/socigit/build/head
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DSOCI_CXX11=ON -DSOCI_TESTS=OFF ../..
$ make
$ sudo make install
$ popd
$ mkdir -p /opt/soci/socigit/build/head && cd /opt/soci/socigit/build/head
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local \
-DCMAKE_BUILD_TYPE=Debug -DSOCI_CXX11=ON \
-DSOCI_ASAN=ON -DCMAKE_VERBOSE_MAKEFILE=OFF \
-DSOCI_TESTS=OFF -DSOCI_STATIC=OFF -DSOCI_DB2=OFF -DSOCI_EMPTY=ON \
-DSOCI_FIREBIRD=OFF -DSOCI_MYSQL=ON -DSOCI_ODBC=OFF -DSOCI_ORACLE=OFF \
-DSOCI_POSTGRESQL=ON -DSOCI_SQLITE3=ON ../..
$ make
$ sudo make install
To customize OpenTREP to your environment, you can alter the installation directory:
export INSTALL_BASEDIR="${HOME}/dev/deliveries"
export TREP_VER="0.07.16"
if [ -d /usr/lib64 ]; then LIBSUFFIX="64"; else LIBSUFFIX=""; fi
export LIBSUFFIX_4_CMAKE="-DLIB_SUFFIX=$LIBSUFFIX"
Then, as usual:
$ rm -rf build && mkdir build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_BASEDIR}/opentrep-${TREP_VER} \
-DCMAKE_BUILD_TYPE:STRING=Debug -DENABLE_TEST:BOOL=ON \
-DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF ${LIBSUFFIX_4_CMAKE} ..
$ cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_BASEDIR}/opentrep-${TREP_VER} \
-DCMAKE_BUILD_TYPE:STRING=Debug -DENABLE_TEST:BOOL=ON \
-DBOOST_LIBRARYDIR=/usr/lib64/boost169 \
-DBOOST_INCLUDEDIR=/usr/include/boost169 \
-DBoost_ADDITIONAL_VERSIONS="1.69 1.69.0" \
-DINSTALL_DOC:BOOL=ON -DRUN_GCOV:BOOL=OFF ${LIBSUFFIX_4_CMAKE} ..
cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
-DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=OFF
-DRUN_GCOV:BOOL=OFF ${LIBSUFFIX_4_CMAKE} ..
* On MacOS, a few software (_e.g._, ICU and Readline) are not in
the standard place. So, the `cmake` command becomes:
```bash
$ export CMAKE_CXX_FLAGS="-Wno-mismatched-new-delete"; \
cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_BASEDIR}/opentrep-$TREP_VER \
-DREADLINE_ROOT=/usr/local/opt/portable-readline \
-DREADLINE_INCLUDE_DIR=/usr/local/opt/portable-readline/include \
-DREADLINE_LIBRARY=/usr/local/opt/libedit/lib/libedit.dylib \
-DICU_ROOT=/usr/local/opt/icu4c \
-DCMAKE_BUILD_TYPE:STRING=Debug -DINSTALL_DOC:BOOL=ON \
-DRUN_GCOV:BOOL=OFF ${LIBSUFFIX_4_CMAKE} ..
$ make
$ make check
libopentrep*.so*
) and the binary (opentrep
),
just type:
make install
cd ${INSTALL_BASEDIR}
rm -f opentrep-stable && ln -s opentrep-${TREP_VER} opentrep-stable
cd -
$ make dist
$ make package
optd_por_public_all.csv
) has therefore
to be downloaded aside, usually renamed as optd_por_public.csv
,
and the OpenTREP binaries have then to be referred to the file-path
of that POR data file.
$ wget \
https://github.com/opentraveldata/opentraveldata/raw/master/opentraveldata/optd_por_public_all.csv \
-O ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
$ ./opentrep/opentrep-{dbmgr,indexer,searcher}
$ export TREP_LIB="${INSTALL_BASEDIR}/opentrep-${TREP_VER}/lib${LIBSUFFIX}"
$ export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${TREP_LIB}"
$ ${INSTALL_BASEDIR}/opentrep-${TREP_VER}/bin/opentrep-{dbmgr,indexer,searcher}
OpenTREP may use, if so configured, a relational database. For now,
two database products are supported, SQLite3 and MySQL/MariaDB.
The database accelerates the look up of POR by (IATA, ICAO, FAA) codes
and of Geonames ID. When OpenTREP is configured to run without database,
those codes and Geonames ID are full-text searched directly with Xapian.
Note that the database can be managed directly, i.e., without the
OpenTREP search interface on top of it, thanks to the opentrep-dbmgr
utility, which is detailed below.
Here, for clarity reason, we use the local version. It is easy (see above) to derive the same commands with the installed version.
$ ./opentrep/opentrep-dbmgr -t sqlite -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
opentrep>
shell, a typical sequence for SQLite would be:
info
create_user
fill_from_por_file
list_nb
list_by_iata nce
list_by_icao lfmn
list_by_faa afm
list_by_geonameid 6299418
./opentrep/opentrep-dbmgr -t mysql -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
opentrep>
shell, a typical sequence for MySQL/MariaDB
would be:
reset_connection_string db=mysql user=root password=<passwd>
create_user
reset_connection_string db=trep_trep user=trep password=trep
fill_from_por_file
list_nb
list_by_iata nce
list_by_icao lfmn
list_by_faa afm
list_by_geonameid 6299418
By default, the Xapian indexer runs without filling any relational database,
as that step can be performed independantly by opentrep-dbmgr
,
as seen above.
$ ./opentrep/opentrep-indexer -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
$ ./opentrep/opentrep-indexer -t sqlite -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
$ ./opentrep/opentrep-indexer -t mysql -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
$ ./opentrep/opentrep-indexer -x 0 -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
$ ./opentrep/opentrep-indexer -d /var/www/webapps/opentrep/trep/traveldb -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
$ ./opentrep/opentrep-dbmgr -t sqlite -s /var/www/webapps/opentrep/trep/sqlite_travel.db -p ${INSTALL_BASEDIR}/share/opentrep/data/por/optd_por_public.csv
create_user
fill_from_por_file
quit
$ ./opentrep/opentrep-searcher -q "nce sfo"
$ ./opentrep/opentrep-searcher -t sqlite -q "nce sfo"
$ ./opentrep/opentrep-searcher -t mysql -q "nce sfo"
webapps
directory):
$ ./opentrep/opentrep-searcher -d /var/www/webapps/opentrep/trep/traveldb -t sqlite -s /var/www/webapps/opentrep/trep/sqlite_travel.db -q "nce sfo"
The idea is to have at least two pieces of infrastructure (SQL database, Xapian index) in parallel:
Once the new version has been validated, the two pieces of infrastructure can then be interverted, ie, the production becomes the new version, and the older version ends up in staging.
It means that all programs have to choose which version they want to work on. That version may even be toggled in live.
That method to deploy in production through a staging process is even more needed by the fact that indexing a new POR data file takes up to 30 minutes in the worst case. So, we cannot afford 30-45 minutes of downtime everytime a new POR data file is released (potentially every day).
With that staging process, it is even possible to fully automate the re-indexing after a new POR data file release: once the new release has been cleared by QA (Quality Assurance) on staging, it becomes production.
The corresponding command-line option for the various programs
(opentrep-dbmgr
, opentrep-indexer
, opentrep-searcher
) is -m
.
$ ./opentrep/opentrep-indexer -m 0 -d /var/www/webapps/opentrep/trep/traveldb
$ chown -R apache.apache /var/www/webapps/opentrep/trep
$ ls -laFh /var/www/webapps/opentrep/trep/
-rw-r--r-- 1 apache apache 16M Oct 14 2018 sqlite_travel.db0
drwxr-xr-x 2 apache apache 4.0K Oct 14 2018 traveldb0/
$ ./opentrep/opentrep-indexer -m 1 -d /var/www/webapps/opentrep/trep/traveldb
$ chown -R apache.apache /var/www/webapps/opentrep/trep
$ ls -laFh /var/www/webapps/opentrep/trep/
-rw-r--r-- 1 apache apache 16M Oct 14 2018 sqlite_travel.db1
drwxr-xr-x 2 apache apache 4.0K Oct 14 2018 traveldb1/
There is also a command-line option, namely -n
, to state whether or not
the non-IATA-referenced POR should be included/parsed and indexed.
By default, and historically, only the POR, which are referenced by IATA (ie, which have a specific IATA code), are indexed (and may be searched for) in OpenTREP.
POR are also referenced by other international organizations, such as ICAO or UN/LOCODE, and may not be referenced by IATA (in which case their IATA code is left empty).
As of October 2018, there are around 110,000 POR in OpenTravelData (OPTD), the reference data source for OpenTREP:
Around 90,000 POR are not referenced by IATA, but referenced by other international organizations (eg, ICAO, UN/LOCODE)
Once indexed, all those POR become searchable. That flag is therefore
only used at indexing time (i.e., by the opentrep-dbmgr
and
opentrep-indexer
programs).
All the details are explained on a dedicated procedure, which works for the major Linux distributions and on MacOS.
The procedure first installs a specific version of Python (as of January 2022,
3.9.9) thanks to PyEnv, then install pipenv
thanks to the pip
utility
provided with that specific Python version.
PYTHON_VERSION=$(python --version 2>&1 | cut -d' ' -f2,2 | cut -d'.' -f1,2)
PYTHONPATH=${INSTALL_BASEDIR}/opentrep-${TREP_VER}/lib${LIBSUFFIX}:${INSTALL_BASEDIR}/opentrep-${TREP_VER}/lib${LIBSUFFIX}/python${PYTHON_VERSION}/site-packages/pyopentrep \
python3 -c "import pyopentrep; \
openTrepLibrary = pyopentrep.OpenTrepSearcher(); \
initOK = openTrepLibrary.init (\"${INSTALL_BASEDIR}/opentrep-${TREP_VER}/share/opentrep/data/por/test_optd_por_public.csv\", '/tmp/opentrep/xapian_traveldb', 'sqlite', '/tmp/opentrep/sqlite_travel.db', 0, False, True, True, 'pyopentrep.log'); \
print (openTrepLibrary.search ('S', 'los las'))"
PYTHON_VERSION=$(python --version 2>&1 | cut -d' ' -f2,2 | cut -d'.' -f1,2)
PYTHONPATH=${INSTALL_DIR}/lib${LIBSUFFIX}:${INSTALL_BASEDIR}/lib${LIBSUFFIX}/python${PYTHON_VERSION}/site-packages/pyopentrep \
python3 -c "import pyopentrep; \
openTrepLibrary = pyopentrep.OpenTrepSearcher(); \
initOK = openTrepLibrary.init (\"${INSTALL_BASEDIR}/opentrep-${TREP_VER}/share/opentrep/data/por/test_optd_por_public.csv\", '/var/www/webapps/opentrep/trep/traveldb', 'mysql', 'db=trep_trep user=trep password=trep', 0, False, True, True, 'pyopentrep.log'); \
print (openTrepLibrary.search ('S', 'los las'))"
$ ./opentrep/python/pyopentrep -d /tmp/opentrep/xapian_traveldb "nce sfo"
==217==ERROR: Interceptors are not working. This may be because AddressSanitizer is loaded too late (e.g. via dlopen). Please launch the executable with:
DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib
"interceptors not installed" && 0Abort trap: 6
$ PYTHON_VERSION=$(python3 --version 2>&1 | cut -d' ' -f2,2 | cut -d'.' -f1,2)
$ PYTHONPATH=${INSTALL_BASEDIR}/opentrep-${TREP_VER}/lib${LIBSUFFIX}:${INSTALL_BASEDIR}/opentrep-${TREP_VER}/lib${LIBSUFFIX}/python${PYTHON_VERSION}/site-packages/pyopentrep \
DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib \
ASAN_OPTIONS=detect_container_overflow=0 \
/usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python \
./opentrep/python/pyopentrep.py -d /tmp/opentrep/xapian_traveldb "nce sfo"
OPTD-maintained list of POR (points of reference): '~/dev/deliveries/opentrep-${TREP_VER}/share/opentrep/data/por/test_optd_por_public.csv'
Xapian-based travel database/index: '/tmp/opentrep/xapian_traveldb0'
SQLite database: '/tmp/opentrep/sqlite_travel.db'
searchString: nce sfo
Compact format => recognised place (city/airport) codes:
NCE SFO
------------------
OpenTREP depends on Boost libraries, including Boost Python C extensions, and on Protobuf Python extensions too. Those Boost and Protobuf C extensions generally come with the system (e.g., installed by Homebrew on MacOS, DNF on Fedora/CentOS/RedHat, APT on Debian/Ubuntu).
Hence, installing a local virtual environment will not work, especially when the Python version of the virtual environment does not match exactly the Python version of the system-installed libraries.
The simplest approach so far is to use the Python installed by the system.
Still, this can be done with pip
, with that latter potentially installed
on the user account only with the --user
option when upgrading pip
itself (with python -m pip install --user -U pip
).
Note that Linux binary wheels cannot be pushed as is onto PyPi. Manylinux should be used for that. Scikit-build maintains some additions on top of Manylinux and the corresponding Manylinux Docker images. The way to run those have still to be documented below. In the meantime, the OpenTREP wheel has to be built from the sources, either (see below for the details):
pip
module of the system-based Python:$ pyenv global system
$ python -m pip install --user -U pip
$ python -m pip install -U setuptools cmake build wheel ninja scikit-build
$ python -m pip install -U pytest tox twine sphinx keyrings.alt flake8 black
$ python -m pip install -U simplejson protobuf
$ python -m pip install -U pyjq pyyaml
pip
OpenTREP extension/module is installed here as a system-based module
with system-based Python and pip
pip
:
$ python -mpip install -U opentrep
Defaulting to user installation because normal site-packages is not writeable
Collecting opentrep
Using cached opentrep-0.7.14.tar.gz (1.7 MB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing wheel metadata ... done
Building wheels for collected packages: opentrep
Building wheel for opentrep (PEP 517) ... done
Created wheel for opentrep: filename=opentrep-0.7.14-cp39-cp39-linux_x86_64.whl size=3060796 sha256=6362e3a86af016b251fe33b9f76db17322ec15a60575082f31f6b719ba2cf97f
Stored in directory: ~/.cache/pip/wheels/82/b3/7c/f026b883cc204eefab1588f5e68661f78fec25395277bd221d
Successfully built opentrep
Installing collected packages: opentrep
Successfully installed opentrep-0.7.14
LD_LIBRARY_PATH
/DYLD_LIBRARY_PATH
and PYTHONPATH
environment variables
$ INST_DIR=${HOME}/.local
TREPBINDIR=${INST_DIR}/bin
OPTDPOR=${INST_DIR}/share/opentrep/data/por/test_optd_por_public.csv
export LD_LIBRARY_PATH=${INST_DIR}/lib
export PYTHONPATH=${INST_DIR}/lib:${INST_DIR}/lib/python3.9/site-packages/pyopentrep
$ export INST_DIR=/usr/local
export PYTHONPATH=${INST_DIR}/lib:${INST_DIR}/lib/python3.9/site-packages/pyopentrep
export DYLD_LIBRARY_PATH=${INST_DIR}/lib
Pyenv
on the system-based Python, which should be Python 3:
$ pyenv global system
$ python --version
Python 3.9.9
_skbuild/*-x86_64-3.9/: -rw-r–r– 1 user staff 0B Jan 10 19:10 _skbuild_MANIFEST drwxr-xr-x 24 user staff 768B Jan 10 19:10 cmake-build/ drwxr-xr-x 6 user staff 192B Jan 10 19:10 cmake-install/ drwxr-xr-x 3 user staff 96B Jan 10 19:10 setuptools/
* Set the `LD_LIBRARY_PATH` and `PYTHONPATH` environment variables:
```bash
$ INST_DIR=${PWD}/_skbuild/macosx-13.0-x86_64-3.9/cmake-install
TREPBINDIR=${INST_DIR}/bin
OPTDPOR=${INST_DIR}/share/opentrep/data/por/test_optd_por_public.csv
export LD_LIBRARY_PATH=${INST_DIR}/lib
export PYTHONPATH=${INST_DIR}/lib:${INST_DIR}/lib/python3.9/site-packages/pyopentrep
$ docker pull scikitbuild/manylinux2010_x86_64:09d11d5f8
$ docker run --rm -e PLAT=manylinux2010_x86_64 -v `pwd`:/io scikitbuild/manylinux2010_x86_64:09d11d5f8 linux64 /io/travis/build-wheels.sh
View at: https://test.pypi.org/project/opentrep/0.7.14/
* Upload/release the Python packages onto the
[PyPi repository](https://pypi.org):
```bash
user@laptop$ PYPIURL="https://upload.pypi.org"
user@laptop$ keyring set ${PYPIURL}/ __token__
Password for '__token__' in '${PYPIURL}/':
user@laptop$ twine upload -u __token__ --repository-url ${PYPIURL}/legacy/ dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Uploading opentrep-0.7.14.post2-cp39-cp39-macosx_13_0_x86_64.whl
100%|█████████████████████████████████████████████████████████████████████| 9.86M/9.86M [01:00<00:00, 172kB/s]
Uploading opentrep-0.7.14.post2.tar.gz
100%|█████████████████████████████████████████████████████████████████████| 1.65M/1.65M [00:12<00:00, 139kB/s]
View at:
https://pypi.org/project/opentrep/0.7.14.post2/
$ pyenv local system
$ python -V
Python 3.10.1
$ type python3
python3 is ~/.pyenv/shims/python3
$ pyenv local system
$ python3 -V
Python 3.11.0
$ type python3
python3 is hashed (/usr/local/opt/python@3.11/bin/python3)
opentrep
Python extension
$ python -mpip uninstall opentrep
$ python -mpip install -U opentrep # will take a few minutes, as OpenTREP is built again
python3
should point to
/usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python
):
$ python3 -mpip uninstall opentrep
$ python3 -mpip install -U opentrep
$ python -mpip show opentrep
Name: opentrep
Version: 0.7.14
...
Location: ~/.pyenv/versions/3.10.1/lib/python3.9/site-packages
Requires: protobuf
$ python3 -mpip show opentrep
Name: opentrep
Version: 0.7.14
...
Location: /usr/local/lib/python3.9/site-packages
Requires: protobuf
PYTHONPATH
environment variable to where the system Python
is installed
$ export PYTHONPATH="${HOME}/.local/lib:${HOME}/.local/lib/python3.10/site-packages/pyopentrep"
export LD_LIBRARY_PATH="${HOME}/.local/lib:${HOME}/.local/lib/python3.10/site-packages/pyopentrep:${LD_LIBRARY_PATH}"
/usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python
and Python libraries are installed simply in /usr/local/lib
):
$ export PYTHONPATH="/usr/local/lib:/usr/local/lib/python3.11/site-packages/pyopentrep"
pytest
$ python -mpytest test_trep_e2e_simple.py
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python -mpytest test_trep_e2e_simple.py
test_trep_e2e_simple.py [100%]
================== 1 passed in 1.38s ==============
## Use the OpenTREP Python extension
### Download the latest OpenTravelData (OPTD) POR data file
* If not already done, install a few more Python modules
+ On Linux:
```bash
$ python -mpip install -U opentrepwrapper opentraveldata
$ python3 -mpip install -U opentrepwrapper opentraveldata
$ python
Python 3.10.15 (default, November 2022)
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python
>>> import opentraveldata
>>> myOPTD = opentraveldata.OpenTravelData()
>>> myOPTD.downloadFilesIfNeeded()
>>> myOPTD
OpenTravelData:
Local IATA/ICAO POR file: /tmp/opentraveldata/optd_por_public_all.csv
Local UN/LOCODE POR file: /tmp/opentraveldata/optd_por_unlc.csv
>>> myOPTD.fileSizes()
(44588871, 4967092)
-i
option of pyopentrep.py
,
so as to index the full OpenTravelData (OPTD) POR (points of reference)
data file
$ python ~/.local/lib/python3.10/site-packages/pyopentrep/pyopentrep.py -p /tmp/opentraveldata/optd_por_public_all.csv -i
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python /usr/local/lib/python3.11/site-packages/pyopentrep/pyopentrep.py -p /tmp/opentraveldata/optd_por_public_all.csv -i
OPTD-maintained list of POR (points of reference): '/tmp/opentraveldata/optd_por_public_all.csv'
Xapian-based travel database/index: '/tmp/opentrep/xapian_traveldb0'
SQLite database: '/tmp/opentrep/sqlite_travel.db'
Perform the indexation of the (Xapian-based) travel database.
That operation may take several minutes on some slow machines.
It takes less than 20 seconds on fast ones...
Number of actually parsed records: 1,000, out of 103,394 records in the POR data file so far
...
Number of actually parsed records: 20,000, out of 122,394 records in the POR data file so far
Done. Indexed 20372 POR (points of reference)
opentrep-indexer
utility (that is the former way of initializing
the Xapian index, when it was not available from the Python utility):
$ ${TREPBINDIR}/opentrep-indexer -t sqlite -a 1 -p ${OPTDPOR}
POR file-path is: ~/.pyenv/versions/3.9.9/share/opentrep/data/por/test_optd_por_public.csv
Deployment number: 0
Xapian index/database filepath is: /tmp/opentrep/xapian_traveldb0
SQL database type is: sqlite
SQL database connection string is: /tmp/opentrep/sqlite_travel.db0
Are non-IATA-referenced POR included? 0
Index the POR in Xapian? 1
Add and re-index the POR in the SQL-based database? 1
Log filename is: opentrep-indexer.log
Parsing and indexing the OpenTravelData POR data file (into Xapian and/or SQL databases) may take a few tens of minutes on some architectures (and a few minutes on fastest ones)...
9 entries have been processed
$ python ~/.local/lib/python3.10/site-packages/pyopentrep/pyopentrep.py
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python /usr/local/lib/python3.11/site-packages/pyopentrep/pyopentrep.py
OPTD-maintained list of POR (points of reference): '/tmp/opentrep/test_optd_por_public.csv'
Xapian-based travel database/index: '/tmp/opentrep/xapian_traveldb0'
SQLite database: '/tmp/opentrep/sqlite_travel.db'
searchString: sna francisco rio de janero los angeles reykyavki
Compact format => recognised place (city/airport) codes:
SFO RIO LAX REK
------------------
$ python ~/.local/lib/python3.10/site-packages/pyopentrep/pyopentrep.py -f F "cnsha deham deess"
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python /usr/local/lib/python3.11/site-packages/pyopentrep/pyopentrep.py -f F "cnsha deham deess"
OPTD-maintained list of POR (points of reference): '/tmp/opentrep/test_optd_por_public.csv'
Xapian-based travel database/index: '/tmp/opentrep/xapian_traveldb0'
SQLite database: '/tmp/opentrep/sqlite_travel.db'
searchString: cnsha deham deess
Raw result from the OpenTrep library:
1. SHA-A-6301388, 34.7007%, Shanghai Hongqiao International Airport, Shanghai Hongqiao International Airport, ZSSS, , CNSHA, , 0, 1970-Jan-01, 2999-Dec-31, , SHA|1796236|Shanghai|Shanghai|CN|SH, SH, CN, , China, 713, China, CNY, NA, Asia, 31.1979, 121.336, S, AIRP, 23, Shanghai, Shanghai, , , , Z, , 0, 3, 3, Asia/Shanghai, 8, 8, 8, 2014-Aug-01, , https://en.wikipedia.org/wiki/Shanghai_Hongqiao_International_Airport, 31.1979, 121.336, cnsha, cnsha, 34.7007%, 0, 0
2. HAM-C-2911298, 12.8103%, Hamburg, Hamburg, , , DEHAM, , 0, 1970-Jan-01, 2999-Dec-31, , HAM|2911298|Hamburg|Hamburg|DE|HH, HH, DE, , Germany, 429, Germany, EUR, NA, Europe, 53.5753, 10.0153, P, PPLA, 04, Hamburg, Hamburg, 00, , , 02000, 02000000, 1739117, 0, 2, Europe/Berlin, 1, 2, 1, 2019-Nov-28, HAM,LBC,OBZ,XFW,ZMB, https://en.wikipedia.org/wiki/Hamburg, 53.5507, 9.99302, deham, deham, 12.8103%, 0, 0
3. ESS-C-2928810, 1.34094%, Essen, Essen, , , DEESS, , 0, 1970-Jan-01, 2999-Dec-31, , ESS|2928810|Essen|Essen|DE|NW, NW, DE, , Germany, 429, Germany, EUR, NA, Europe, 51.4566, 7.01228, P, PPLA3, 07, North Rhine-Westphalia, North Rhine-Westphalia, 051, Düsseldorf District, Duesseldorf District, 05113, 05113000, 593085, 0, 83, Europe/Berlin, 1, 2, 1, 2019-Oct-22, ESS,ESZ, https://en.wikipedia.org/wiki/Essen, 0, 0, deess, deess, 1.34094%, 0, 0
------------------
$ python
Python 3.10.1 (main, Jan 10 2022, ...) on linux
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python
>>> import pyopentrep
>>> openTrepLibrary = pyopentrep.OpenTrepSearcher()
>>> initOK = openTrepLibrary.init ('/tmp/opentraveldata/optd_por_public.csv', '/tmp/opentrep/xapian_traveldb', 'sqlite', '/tmp/opentrep/sqlite_travel.db', 0, False, True, True, 'pyopentrep.log')
>>> openTrepLibrary.search('S', 'nce sfo')
'NCE/0,SFO/0'
>>> openTrepLibrary.search('F', 'nce sfo')
"1. NCE-C-2990440, 8.16788%, Nice, Nice, , , FRNCE, , 0, 1970-Jan-01, 2999-Dec-31, , NCE|2990440|Nice|Nice|FR|PAC, PAC, FR, , France, 427, France, EUR, NA, Europe, 43.7031, 7.26608, P, PPLA2, 93, Provence-Alpes-Côte d'Azur, Provence-Alpes-Cote d'Azur, 06, Alpes-Maritimes, Alpes-Maritimes, 062, 06088, 338620, 25, 18, Europe/Paris, 1, 2, 1, 2019-Sep-05, NCE, https://en.wikipedia.org/wiki/Nice, 0, 0, NA, nce, 0%, 0, 0\n2. SFO-C-5391959, 32.496%, San Francisco, San Francisco, , , USSFO, , 0, 1970-Jan-01, 2999-Dec-31, , SFO|5391959|San Francisco|San Francisco|US|CA, CA, US, , United States, 91, California, USD, NA, North America, 37.7749, -122.419, P, PPLA2, CA, California, California, 075, City and County of San Francisco, City and County of San Francisco, Z, , 864816, 16, 28, America/Los_Angeles, -8, -7, -8, 2019-Sep-05, SFO, https://en.wikipedia.org/wiki/San_Francisco, 0, 0, NA, sfo, 0%, 0, 0\n"
>>> quit()
$ python
Python 3.10.1 (main, Jan 10 2022, ...) on linux
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python
>>> from OpenTrepWrapper import main_trep, index_trep
>>> main_trep (searchString = 'nce sfo', outputFormat = 'S', xapianDBPath = '/tmp/opentrep/xapian_traveldb', logFilePath = '/tmp/opentrep/opeentrep-searcher.log', verbose = False)
([(173.579, 'NCE'), (390.644, 'SFO')], '')
>>> main_trep (searchString = 'cnsha deham', outputFormat = 'S', xapianDBPath = '/tmp/opentrep/xapian_traveldb', logFilePath = '/tmp/opentrep/opeentrep-searcher.log', verbose = False)
([(0.34700699999999995, 'SHA'), (0.128103, 'HAM')], '')
>>> quit()
$ python -mpip install -U django
$ python3 -mpip install -U django
$ export TREP_TRAVELDB=/tmp/opentrep/traveldb
$ export TREP_LOG=django_trep.log
$ pushd gui/django/webapps/opentrep
$ python manage.py runserver localhost:8000
Python 3.10.1 (default, November 2021)
$ DYLD_INSERT_LIBRARIES=/Library/Developer/CommandLineTools/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib ASAN_OPTIONS=detect_container_overflow=0 /usr/local/Cellar/python@3.11/3.11.0/Frameworks/Python.framework/Versions/3.11/Resources/Python.app/Contents/MacOS/Python manage.py runserver localhost:8000
$ open "http://localhost:8000/search?q=rio de janero reykyavik sna francicso"
$ popd