Re: modularize Banana appplication with traits; need of examples

Hi

A fixed code for the original problem is here:
https://github.com/jmvanel/semantic_forms/blob/master/scala/forms/src/test/scala/deductions/runtime/services/TestTrait.scala

And I cannot do better than paste Anton's response on Gitter Banana chat:


The problem here is that @jmvanel extends SparqlOpsModule and
SparqlOpsModule extends RdfModule:

trait RDFModule {
  type Rdf <: RDF
}

As you see this module forces you to define Rdf type alias. While @jmvanel
has generic parameter with the same name:

trait TestTrait[Rdf <: RDF, DATASET]

and that breaks his code, because type alias and generic type parameter are
two different entities.
[..]
My conclusion is that if you want to just use Banana-RDF in your
application, and you use Rdf generic type parameter, you should not extend
Modules because of this problem, and you should resolve ops from type
parameter instead.

2015-07-13 17:11 GMT+02:00 Jean-Marc Vanel <jeanmarc.vanel@gmail.com>:

> Hi all
>
> All of the Banana tests use classes , not traits.
> However, the best practice for modularizing with Scala seems to use traits.
>
> The Banana documentation is geared towards people extending the framework
> e.g. for adding support to new RDF engines.
> But there is not really a documentation oriented toward appplication
> developers.
>
> And the only open source Banana applications are mine, so there is no
> other source of inspiration.
> Does this mean that Banana is only for the beauty of the code ?
> I don't think so !
>
> This being said,
> here is a short trait that is not compiling.
> In the last mounths,
> I tried several designs, but I was not able to find some design patterns
> for Banana with traits.
>
> The compile message is:
> type mismatch; found : query.type (with underlying type
> TestTrait.this.Rdf#ConstructQuery) required: Rdf#ConstructQuery
>
> And the code :
>
> package deductions.runtime.services
>
> import scala.util.Try
> import org.w3.banana.RDF
> import org.w3.banana.RDFOps
> import org.w3.banana.RDFStore
> import org.w3.banana.SparqlEngine
> import org.w3.banana.SparqlOps
> import org.w3.banana.syntax._
> import org.w3.banana.SparqlOpsModule
>
> trait RDFStoreLocalProvider[Rdf <: RDF, DATASET] {
>   implicit val rdfStore: RDFStore[Rdf, Try, DATASET]
>   val dataset: DATASET
> }
>
> trait TestTrait[Rdf <: RDF, DATASET]
>     extends RDFStoreLocalProvider[Rdf, DATASET]
>     with SparqlOpsModule {
>
>   implicit val ops: RDFOps[Rdf]
>   val queryString = s"""
>          |CONSTRUCT { ?thing ?p ?o } WHERE {
>          |  graph ?g {
>          |    ?thing ?p ?o .
>          |    FILTER regex( ?o, "search", 'i')
>          |  }
>          |}""".stripMargin
>
>   import ops._
>   import sparqlOps._
>   import rdfStore.sparqlEngineSyntax._
>
>   def lookup(search: String) = {
>     val graph =
>       for {
>         query <- parseConstruct(queryString)
>         es <- dataset.executeConstruct(query, Map()) // ERROR
>       } yield es
>     val triples = ops.getTriples(graph) // ERROR
>   }
> }
>
>
> --
> Jean-Marc Vanel
> Déductions SARL - Consulting, services, training,
> Rule-based programming, Semantic Web
> http://deductions-software.com/
> +33 (0)6 89 16 29 52
> Twitter: @jmvanel , @jmvanel_fr ; chat: irc://irc.freenode.net#eulergui
>



-- 
Jean-Marc Vanel
Déductions SARL - Consulting, services, training,
Rule-based programming, Semantic Web
http://deductions-software.com/
+33 (0)6 89 16 29 52
Twitter: @jmvanel , @jmvanel_fr ; chat: irc://irc.freenode.net#eulergui

Received on Sunday, 16 August 2015 07:24:29 UTC