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

uqbar.arena.persistence.mapping.EntityMapping.scala Maven / Gradle / Ivy

The newest version!
package uqbar.arena.persistence.mapping

import scala.collection.JavaConversions._
import scala.collection.mutable.HashSet
import scala.collection.mutable.Set

import org.neo4j.graphdb.DynamicRelationshipType
import org.neo4j.graphdb.Node
import org.uqbar.commons.model.Entity

import uqbar.arena.persistence.Session

class EntityMapping[T <: Entity](clazz: Class[T]) {
  var mappings = new HashSet[Mapping]();

  def persist(session: Session, target: Object) {
    val entity = target.asInstanceOf[Entity];
    val graphDB = session.graphDB

    var node: Node = null;

    if (entity.isNew)
      node = graphDB.createNode()
    else
      node = graphDB.getNodeById(entity.getId().longValue)

    entity.setId(node.getId().toInt)

    graphDB.index().forNodes("CLASS").add(node, "clazzName", entity.getClass().getCanonicalName());

    node.setProperty("clazzName", entity.getClass().getCanonicalName())

    session.registerEntity(entity)

    for (m <- mappings) {
      m.persist(session, node, target);
    }
  }

  def hidrate(session: Session, target: Object) {
    val entity = target.asInstanceOf[Entity];
    val graphDB = session.graphDB

    val node = graphDB.getNodeById(entity.getId().longValue)

    for (m <- mappings) {
      m.hidrate(session, node, target);
    }
  }

  def getAllFields(): Set[Mapping] = {
    this.mappings.filter({ x =>
      x match {
        case y: FieldMapping =>
          true
        case _ => false
      }
    })
  }

  def searchByExample(entity: T, session: Session): List[T] = {
    val graphDB = session.graphDB
    val queryBuilder = new QueryBuilder()

    for (m <- mappings) {
      m.query(queryBuilder, entity)
    }
    val queryString = queryBuilder.query

    val nodes = {
      if (!queryString.isEmpty())
        graphDB.index().forNodes("Attr-" + entity.getClass().toString()).query(queryString).iterator()
      else {
        graphDB.index().forNodes("CLASS").get("clazzName", clazz.getName()).iterator()
      }
    }
    session.convertTo(this.clazz, nodes);
  }
}

class QueryBuilder() {
  val builder = StringBuilder.newBuilder

  def add(name: String, v: String) {
    if (!builder.isEmpty)
      builder.append(" AND ")

    val nv = v.replaceAll("\\s", "\\\\ ");

    if (nv.startsWith("*") && nv.endsWith("*"))
      builder.append(name).append(":").append(nv)
    else
      builder.append(name).append(":\"").append(nv).append("\"")
  }

  def query(): String = {
    builder.toString
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy