GeoMesa Scala Console
=====================

The GeoMesa tools have a ``scala-console`` command that starts a Scala REPL (read/evaluate/print/loop) configured
for use with GeoMesa. The command will place the GeoMesa classpath and configuration
for that distribution on the REPL's classpath. Additionally it will preload commonly
used imports. The command also comes with tooling that will provide the option to
download and run the appropriate version Scala if it is not available. This is a
portable install and will not alter the machine's current configuration.

Example Usage
-------------

The following example was performed against the FileSystem data store generated by the
:ref:`fsds_quickstart`. It shows how to use the ``scala-console`` command to connect
to a FileSystem Datastore, discover the feature type names, get the schema and query for data.

.. note::

    This code is running against the output of the FileSystem Datastore. To reproduce
    this code exactly you must run the FileSystem Datastore Quickstart first.


.. tabs::

    .. tab:: Demo

        .. raw:: html

            <script src="https://asciinema.org/a/163034.js" id="asciicast-163034" async></script>

    .. tab:: Transcript

        First we run the command, this starts up the Scala REPL with all of the
        resources we need.

        .. code-block:: bash

            $ bin/geomesa-fs scala-console


        After waiting for a few seconds, it will silently import some commonly used libraries and then
        present us with the REPL prompt.

        Next we get a connection to the FileSystem Datastore.

        .. code-block:: none

            scala> val dsParams = Map("fs.path" -> "file:///tmp/fsds/", "fs.encoding" -> "parquet")
            dsParams: scala.collection.immutable.Map[String,String] = Map(fs.path -> file:///tmp/fsds/, fs.encoding -> parquet)

            scala> val ds = DataStoreFinder.getDataStore(dsParams.asJava)
            ds: org.geotools.api.data.DataStore = org.locationtech.geomesa.fs.FileSystemDataStore@27a7ef08


        Now we do some example discovery to see what feature types and schemas are stored
        in the database.

        .. code-block:: none

            scala> ds.getTypeNames()
            res0: Array[String] = Array(gdelt-quickstart)

            scala> val sft = ds.getSchema("gdelt-quickstart")
            sft: org.geotools.api.feature.simple.SimpleFeatureType = SimpleFeatureTypeImpl gdelt-quickstart identified extends Feature(GLOBALEVENTID:GLOBALEVENTID,Actor1Name:Actor1Name,Actor1CountryCode:Actor1CountryCode,Actor2Name:Actor2Name,Actor2CountryCode:Actor2CountryCode,EventCode:EventCode,NumMentions:NumMentions,NumSources:NumSources,NumArticles:NumArticles,ActionGeo_Type:ActionGeo_Type,ActionGeo_FullName:ActionGeo_FullName,ActionGeo_CountryCode:ActionGeo_CountryCode,dtg:dtg,geom:geom)


        In order to sample the data we create a ``Query`` and a ``FeatureReader`` and
        then run the query.

        .. code-block:: none

            scala> val query = new Query(sft.getName.toString())
            query: org.geotools.api.data.Query =
            Query:
               feature type: gdelt-quickstart
               filter: Filter.INCLUDE
               [properties:  ALL ]

            scala> val reader = ds.getFeatureReader(query, Transaction.AUTO_COMMIT)
            reader: org.geotools.api.data.FeatureReader[org.geotools.api.feature.simple.SimpleFeatureType,org.geotools.api.feature.simple.SimpleFeature] = org.geotools.data.simple.DelegateSimpleFeatureReader@7bd96822


        Next, we consume the ``FeatureReader``, printing out the results.

        .. code-block:: none

            scala> while (reader.hasNext()) { println(reader.next().toString()) }
            ScalaSimpleFeature:719024956:719024956|||GANG||120|6|1|6|1|Brazil|BR|Sun Dec 31 19:00:00 EST 2017|POINT (-55 -10)
            ScalaSimpleFeature:719024898:719024898|||SYDNEY|AUS|010|14|2|14|4|Sydney, New South Wales, Australia|AS|Sun Dec 31 19:00:00 EST 2017|POINT (151.217 -33.8833)
            ScalaSimpleFeature:719024882:719024882|SECURITY COUNCIL||PYONGYANG|PRK|163|2|1|2|1|Russia|RS|Sun Dec 24 19:00:00 EST 2017|POINT (100 60)
            ScalaSimpleFeature:719024881:719024881|||RUSSIA|RUS|042|2|1|2|3|Allegheny County, Pennsylvania, United States|US|Sun Dec 24 19:00:00 EST 2017|POINT (-80.1251 40.6253)
            ScalaSimpleFeature:719025149:719025149|ARGENTINE|ARG|DIOCESE||010|1|1|1|4|Corrientes, Corrientes, Argentina|AR|Sun Dec 31 19:00:00 EST 2017|POINT (-58.8341 -27.4806)
            ...


        Finally, we cleanup our connections.

        .. code-block:: none

            scala> reader.close()

            scala> ds.dispose()

