Great discussion topic, @Dmitry Maslennikov. Having the IRIS Data Platform play a role in all kinds of data warehouse/lake architectures is certainly important. Especially since these architectures have been evolving recently to take advantage of the convergence of systems of record and systems of reference -- i.e. transactional and analytical databases. In short, one can easily make a strong argument that the IRIS Data Platform can be the foundation for most operations on data -- transactions, analytics and machine learning. On top of that, I see a strong opportunity for our developer community to create tools that offer better DataOps capabilities, like orchestrating data transformations with data pipelines, creating data catalogs, and augmenting all these with machine learning tools to automate much of this data engineering work.

Hello @Humza Arshad. Thanks for your question! 

Since IRIS 2022.2, you can use JWT authentication to provide a RESTful way of logging in and maintaining that session, which is in line with how many frontend frameworks like to work. The documentation can be found on the JSON Web Token (JWT) Authentication page.

To take advantage of this, you will need to do the following:

  1. Use Unauthenticated access on the web application that serves the UI app
  2. Enable JWT authentication on the web application that handles REST requests
  3. Set UseSession = 0 on the REST handler class for the web application that handles REST requests
  4. Create your own custom login page in the front end. Upon login, this page should submit a payload containing { user: …, password: … } to the /login endpoint as explained in the documentation above
  5. Add front end code to save the access token and refresh token that are returned. The access token needs to be supplied with every subsequent REST request as an Authentication header with the value ‘Bearer <access_token>’.
  6. Add front end code to periodically refresh the access token – this is done by posting the { access_token: …, refresh_token: … } to the /refresh endpoint.

Have you read through the documentation

If you are using client-side editing, the ObjectScript extension doesn't know what git branch you are on. Check out a branch using git, and the ObjectScript extension will use those files. Your client-side source control activities are separate from your ObjectScript development activities (once again, if you are using client-side ObjectScript editing). .DAT files can also be managed in source control with the proviso that GitHub has a limit on how big files can be if you're using a free account.

Hi @jaroslav rapp. Attack may be a strong word, but I understand the feeling when beloved tools get less attention than others. We'd love to never leave a technology behind, but the reality is that with limited resources we sometimes have to devote more effort to technologies that will have bigger benefits for our users going forward. It's not always an easy decision, but I believe the short-term pain is well worth the long-term benefits.

Using the the handy utility from @Alex Woodhead I was able to get something working. As of now you can get the Point, Line and Polygon code from https://github.com/isc-rsingh/spatialiris but I can't guarantee those classes won't change in the future. I include demo code here to show:

  1. $LIST can be converted to a Python list using Py.Helper
  2. 2-dimensional $LISTs (a $LIST of $LISTs) didn't work without running them through the invoke ClassMethod you see below. 
  3. you can integrate with matplotlib to take advantage of the broad and deep range of functionality offered by probably the most popular graphics library around
Class geo.ToolsExample Extends %RegisteredObject
{

ClassMethod createPolygon() As geo.model.Polygon
{
    set l = ##class(geo.model.Line).%New()
    do l.addPoint(##class(geo.model.Point).%New(0.01,0.01))
    do l.addPoint(##class(geo.model.Point).%New(2.01,0.01))
    do l.addPoint(##class(geo.model.Point).%New(2.01,2.01))
    do l.addPoint(##class(geo.model.Point).%New(0.01,2.01))
    do l.addPoint(##class(geo.model.Point).%New(0.01,0.01))
    set polygon = ##class(geo.model.Polygon).%New()
    set polygon.line = l
    Return polygon
}

ClassMethod test()
{
    set polygon = ..createPolygon()
    set isin = ..PointInPolygon(polygon, ##class(geo.model.Point).%New(1.01,1.01))
    w isin,!
    set isout = ..PointInPolygon(polygon, ##class(geo.model.Point).%New(3.01,3.01))
    w isout,!
}

ClassMethod PointInPolygon(poly As geo.model.Polygon, pt As geo.model.Point) As %Boolean
{
    set mp = ##class(%SYS.Python).Import("matplotlib")
    set mpltPath = mp.path
    set polylist = poly.getAsList()
    set nothing = ##class(Py.Helper).toPyListOrString(polylist,.poly2)
    set point = ##class(Py.Helper).toPyListOrString(pt.getAsList())
    set path = ..invoke(mpltPath,poly2)
    Return path."contains_point"(point)
}

ClassMethod invoke(ByRef mpltPath As %SYS.Python, ByRef poly2) As %SYS.Python [ Language = python ]
{
    return mpltPath.Path(poly2)
}

}

Just for clarification, the lines starting with `ARG IMAGE = ` replace each other. Only the last one is actually used. I'm not sure why the others  are left in there but I think its so users will know what worked before. So you can simplify the Dockerfile to:

ARG IMAGE=intersystemsdc/iris-community:preview 
FROM $IMAGE 
RUN iris start IRIS
 \ && iris merge IRIS /tmp/merge.cpf
 \ && iris stop IRIS quietly