Hi Fawad, Caty, all,

Good to know where you are, Fawad. You're on the right track indeed imho, we're 
in tune.

I'm sending you below some feedback (part of it is code review that could take 
place directly on GitHub, but I feel it easier to discuss about it all together 
on the list for now, let's see how it goes, I'm open to any suggestion).

== MapClass and MapTemplate ==

- Query field: I'd suggest we use a large string field because the queries 
could become more complex in the future

- I would consider putting the default values directly in the template, so that 
the user can know what they are when he creates a map, what do you think?

- What about using an integer rather than a long for the zoom level?

- You probably already have this in mind: this will be handy to create a 
MapTemplateProvider as well, for example as indicated on 
<https://extensions.xwiki.org/xwiki/bin/view/Extension/Administration+Application#HCreatetheTemplateProvider>

== MapSheet ==

- Map creation: usually, class instances get created directly in the space of the 
application (see for instance the Diagram application), I would suggest we do the same 
here if that's ok with you, i.e. directly in the Map space, for maps and for points as 
well. As for test data: we will need to store test data indeed without the need to 
recreate it manually everytime, I'm adding an item about that in the "Next 
steps" section below.

- Currently, the sheet issues a call to 
com.xpn.xwiki.api.Object:getXWikiObject. This method requires programming 
rights. Most of the classes in package com.xpn.xwiki.api give access to their 
wrapped core object only to users with programming rights, since it allows to 
manipulate the data at a low level. I'm adding some links below that may help 
you understand this aspect (you may know them already). Another option (the one 
I favour) is to always have the xwiki-platform source code at hand in the IDE, 
so that one can check what the API does exactly. In an XWiki sheet, we 
typically don't want the programming right to be required, because sheets are 
meant to be customized by users, not necessarily by administrators. You will 
hence have to generate the target JSON without resorting to the wrapped 
BaseObject.

 https://www.xwiki.org/xwiki/bin/view/Documentation/DevGuide/Scripting/
 
http://nexus.xwiki.org/nexus/service/local/repositories/public/archive/org/xwiki/platform/xwiki-platform-oldcore/11.3/xwiki-platform-oldcore-11.3-javadoc.jar/!/index.html

- I'm wondering if it's necessary to generate a random id for the map 
container: couldn't we simply use the lower-case serialized map reference?

== CommonMacros ==

Yes, the "handleMapQuery" macro is in the right direction.

== Global code organization ==

- Currently the code uses one space per class. That's an option indeed, but it seems to 
me that the usual practice is more to group all classes and sheets directly in the 
"Code" space. See for instance the blog application: 
https://github.com/xwiki-contrib/application-blog/tree/master/application-blog-ui/src/main/resources/Blog.
 What do you think Caty, all?

- We're currently using the "Maps" space. I know the plural was discussed for 
the app name already, I have no further comment about that. In existing XWiki 
applications, we use either the singular or the plural for the application space. For 
instance, the following apps use the singular: application-diagram, application-xpoll, 
application-meeting, batchimport, application-forum, application-flashmessages (plural in 
the application name, singular in the space name in this case). Other use plural 
everywhere: application-invoices, application-ideas. Question to Caty and to all: do we 
have guidelines for that? This is a minor issue but I have a slight preference for using 
the singular in the space name, since to me it refers primarily to the application 
itself, not necessarily to the location where the target instances will be created. 
Typically, maps could be created anywhere in the wiki. The map app code, though, will be 
stored in that space. Sorry for being picky, I just want to make sure we all agree on the 
final name before a potential refactoring becomes more complex.

== Next steps ==

You probably have several of the next steps if not all in mind already, I'm 
listing some of them below so that we make sure to converge and decide:

- Add a livetable listing all existing maps, in the "WebHome" page of the top 
level application space

- Display page titles in the popups

- Find a way to plug the query mechanism to the Main.SolrSearch and 
Main.SolrSearchMacros (so that we can then use facets). This can be a bit 
tricky, let us know if you need help of course, for this aspect or any other.

- Add a full-text input widget to the map that will issue Solr queries asynchronously to the 
map query service (example: the user inputs "archeologia" -> only pages 
matching that word will get returned, and only the corresponding points will show up on the 
map), which will return the documents matching the initial query completed by the added 
full-text constraint.

- Add a contextual paginated list of results.

- Add facet filters.

- Test data: for now, we have just a few points to test with, but in the near 
future we will need one or several rich data sets samples to test the 
application. I'm not sure whether we should put the data and the code to create 
it in the same repository as the application itself or if we should create a 
dedicated repository. Typically, I foresee some code that will fetch some data 
from Wikidata or OpenStreetMap and convert it to several hundreds or thousands 
of XWiki pages, which in turn will be consumed by a map. Example: the query 
below executed against the endpoint https://query.wikidata.org/ will return all 
the museums referenced in Wikidata with their name, their geographical 
coordinates and their country. We could grab the museum JSON representations 
and turn them into XWiki pages (I have some code for doing such operations in 
another context already, I will commit it soon). I'm wondering if we store the 
test data and code in the same repository (this can amount to hundreds of test 
pages), or in a distinct one. I'll send a separate question to the list about 
this aspect.

  SELECT ?item ?itemLabel ?coord ?lon ?lat ?country ?countryLabel WHERE {
   ?item wdt:P17 ?country.
   ?item wdt:P31 wd:Q33506.   # is a museum
   ?item p:P625 ?coordinate.
   ?coordinate ps:P625 ?coord.
   ?coordinate psv:P625 ?coordinate_node.
   ?coordinate_node wikibase:geoLongitude ?lon.
   ?coordinate_node wikibase:geoLatitude ?lat.
   SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  }

- Regarding paths: I saw you mentioned them on #xwiki, that will be an 
important feature indeed but I feel like it's more important to make sure that 
we have a working prototype consisting of a map, a search input, a list and 
facets with points already, before adding more complex objects to the map, what 
do you think?

Cheers

Stéphane


Fawad Ali:
Hi Stéphane, Ecaterina and all,
Hope all of you are doing wonderful!

So I am working on the new iteration for the Interactive Maps Application and 
have made some progress which I would like to share with all of you.
As suggested by Stephane, the application is now being developed on a new architecture 
which emphasizes the use of Solr queries for gathering data to display on the map. The 
space has also been changed to "Maps" as suggested by Ecaterina.

Link: https://github.com/9inpachi/interactive-maps-new
I have not shifted the files to xwiki-contrib because I wanted an initial 
review if I am doing the right thing so I don't have to change the whole repo 
twice.

I have been able to generate a map and the application is now able to handle 
basic queries to include points (markers) inside the map.

I would like you to please give it a look and let me know if I am going in the 
right direction. :)

Main application pages:
- Maps.Code.Map.MapClass => The main map class
- Maps.Code.Map.MapSheet => Map sheet that renders the map
- Maps.Code.Map.WebHome => Simple form for creating a map object page
- Maps.Code.Point.PointClass => Main class for a simple point (marker)
- Maps.Code.Leaflet => Page where all the javascript and stylesheet extensions 
exist
- Maps.Code.CommonMacros => Some common macros used throughout the application
- Maps.MapTesting => Space that contains objects and maps for testing

For adding a Point, create a simple page, add content to it and attach a 
PointClass object with a value to it.

If you want to have a look at how the map is rendered, see the MapSheet and the 
relevant jsx (leaflet-main) code on the Leaflet page.

I have attached some screenshots to show what the application does at this 
point.

Best,
Fawad


On Wed, May 29, 2019 at 5:12 PM Fawad Ali <m.fawaadal...@gmail.com 
<mailto:m.fawaadal...@gmail.com>> wrote:

    Stéphane,

    Thanks for this. It summarizes our discussions perfectly. :)
    It's actually great that we are on the same page now. I will provide you 
with updates soon.

    Best,
    Fawad


    On Wed, May 29, 2019 at 4:34 PM Stéphane Laurière <slauri...@xwiki.com 
<mailto:slauri...@xwiki.com>> wrote:

        Fawad, Caty, all,

        A quick update following a video call I had with Fawad:

        - The Solr API will be used to query the data to be displayed on the 
map, and the Solr facets to apply additional filters

        - The data returned by the Solr API will be converted to GeoJSON. Later 
on we may consider creating a Solr service that returns (Geo)JSON directly 
rather than HTML, to be discussed.

        Next steps:

        - Creation of a basic Map class with a Solr query field

        - Creation of a MapSheet that will render the map itself

        - Creation of a Point class that will consist of one field storing the 
latitude and the longitude separated by a comma (later on, if needed, we will 
consider storing the latitude and the longitude in two distinct fields)

        - Manual creation (or via the BatchImport application) of 1) a set of 
sample pages that will consist of: a title, some content, and a Point object 
attached to each page, 2) a Map object with a simple Solr query returning  all 
pages with a Point object in a specific space.

        - Conversion of the the results provided by Solr into GeoJSON so that 
the data can be consumed and displayed by Leaflet

        Fawad, please don't hesitate to mention any complementary aspect that I 
may have forgotten or questions you may have.

        Cheers

        Stéphane



--
Stéphane Laurière
XWiki – https://xwiki.com

Reply via email to