All Downloads are FREE. Search and download functionalities are using the official Maven repository.

lspace.structure.Properties.scala Maven / Gradle / Ivy

package lspace.structure

import lspace.Label
import lspace.structure.Property.default
import monix.eval.Task

import scala.collection.mutable

abstract class Properties(val graph: NameSpaceGraph) {
  import graph._

  protected[lspace] val byId: mutable.HashMap[Long, Property] =
    mutable.HashMap[Long, Property]()
  protected[lspace] val byIri: mutable.HashMap[String, Node] =
    mutable.HashMap[String, Node]()

  def get(iri: String): Task[Option[Property]] = {
    Property.properties
      .get(iri)
      .map(Task.now)
      .map(_.map(Some(_)))
      .getOrElse(
        nodeStore
          .hasIri(iri)
          .findL(_.hasLabel(Property.ontology).isDefined)
          //            .filter(_.out(lspace.Label.P.`@label`).nonEmpty)
          .flatMap(_.map { node =>
            Task
              .now(Property.properties
                .getAndUpdate(node))
              .map { property =>
                byId += node.id   -> property
                byIri += node.iri -> node
                property.iris.foreach { iri =>
                  byIri += iri -> node
                }
                property
              }
              .map(Some(_))
          }.getOrElse(Task.now(None))))
  }

  def get(id: Long): Task[Option[Property]] =
    cached(id)
      .map(o => Task.now(Some(o)))
      .getOrElse(
        nodeStore
          .hasId(id)
          .flatMap {
            _.filter(_.hasLabel(Property.ontology).isDefined)
              .map { node =>
                Task
                  .now(Property.properties
                    .getAndUpdate(node))
                  .map { property =>
                    byId += node.id   -> property
                    byIri += node.iri -> node
                    property.iris.foreach { iri =>
                      byIri += iri -> node
                    }
                    property
                  }
                  .map(Some(_))
              }
              .getOrElse(Task.now(None))
          })

  def all: List[Property] = properties.byId.values.toList

  def cached(id: Long): Option[Property] =
    Property.properties
      .cached(id)
      .orElse(byId.get(id))

  def cached(iri: String): Option[Property] =
    Property.properties.get(iri)

  def store(property: Property): Task[Node] = {
    byIri.get(property.iri).map(Task.now).getOrElse {
      if (Property.properties.default.byIri.get(property.iri).isDefined) {
        for {
          node <- nodes.upsert(property.iri, property.iris)
          u <- {
            byId += node.id   -> property
            byIri += node.iri -> node
            property.iris.foreach { iri =>
              byIri += iri -> node
            }
            node.addLabel(Property.ontology)
          }
        } yield node
      } else {
        nodes
          .hasIri(property.iri)
          .findL(n => n.hasLabel(Property.ontology).isDefined)
          .flatMap {
            _
            //            .map(Task.now)
            //      .filter(o => ontology.iris diff o.iris nonEmpty)
              .map(Task.now)
              .getOrElse {
                //        val node = ns.nodes.upsert(ontology.iri, ontology.iris)
                //        node.addLabel(Ontology.ontology)

                for {
                  node <- for {
                    node <- Property.properties.default.idByIri
                      .get(property.iri)
                      .map { id =>
                        for {
                          node <- getOrCreateNode(id)
                          u    <- node.addLabel(Property.ontology)
                        } yield node
                      }
                      .getOrElse {
                        //                  Property.properties.cache(property)
                        nodes.create(Property.ontology)
                      }
                    iri  <- node.addOut(default.typed.iriUrlString, property.iri)
                    iris <- Task.gather(property.iris.map(iri => node.addOut(default.typed.irisUrlString, iri)))
                  } yield {
                    byId += node.id   -> property
                    byIri += node.iri -> node
                    property.iris.foreach { iri =>
                      byIri += iri -> node
                    }
                    node
                  }
                  range <- Task.gather(property.range().map(classtypes.store))
                  //                properties      <- Task.gather(property.properties.map(ns.properties.store))
                  extendedClasses <- Task.gather(property.extendedClasses().map(ns.properties.store))
                  range           <- node.addOut(Property.default.typed.rangeListClassType, range)
                  extended        <- node.addOut(Label.P.`@extends`, extendedClasses)
                  labels <- Task.gather(property.label().map {
                    case (language, label) =>
                      for {
                        label <- node.addOut(Property.default.`@label`, label)
                        lang  <- label.addOut(Property.default.`@language`, language)
                      } yield label
                  })
                  comments <- Task.gather(property.comment().map {
                    case (language, comment) =>
                      for {
                        comment <- node.addOut(Property.default.`@comment`, comment)
                        lang    <- comment.addOut(Property.default.`@language`, language)
                      } yield comment
                  })
                } yield {

                  //                properties.foreach(edges.create(node, Property.default.`@properties`, _))
                  //                properties.foreach(node.addOut(Label.P.`@properties`, _))
                  //                property.properties.foreach(_createEdge(node, Property.default.`@properties`, _))
                  //                extendedClasses.foreach(edges.create(node, Property.default.`@extends`, _))

                  //                property.extendedClasses.foreach(_createEdge(node, Property.default.`@extends`, _))
                  node
                }
              }
          }
      }
    }
  }

  /** Gets all properties which extend key */
  //    def extending(key: Property): Task[List[Property]] =
  //      lspace.g.N
  //        .hasIri(key.iri)
  //        .repeat(_.in(_.`@extends`), collect = true)()
  //        .hasLabel(Property.ontology)
  //        .withGraph(thisgraph)
  //        .toListF
  //        .flatMap { nodes =>
  //          Coeval
  //            .sequence(nodes.distinct.map { node =>
  //              cached(node.iri).map(node => Coeval.now(node)).getOrElse(Property.properties.getAndUpdate(node))
  //            })
  //            .task
  //        }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy