Skip to content

Commit

Permalink
typeing non-meta values
Browse files Browse the repository at this point in the history
  • Loading branch information
Dan Simon committed Jul 18, 2012
1 parent c43c4c0 commit d363976
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 30 deletions.
22 changes: 11 additions & 11 deletions collins/app/models/AssetMeta.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import play.api.libs.json._

import org.squeryl.PrimitiveTypeMode._
import org.squeryl.{Schema, Table}
import util.plugins.solr._


case class AssetMeta(
Expand Down Expand Up @@ -36,26 +37,25 @@ case class AssetMeta(

def valueType = getValueType

def validateValue(value: String): Boolean = getValueType() match {
def validateValue(value: String): Boolean = typeStringValue(value).isDefined

def typeStringValue(value: String): Option[SolrSingleValue] = getValueType() match {
case AssetMeta.ValueType.Integer => try {
Integer.parseInt(value)
true
Some(SolrIntValue(Integer.parseInt(value)))
} catch {
case _ => false
case _ => None
}
case AssetMeta.ValueType.Boolean => try {
new Truthy(value)
true
Some(SolrBooleanValue((new Truthy(value)).isTruthy))
} catch {
case _ => false
case _ => None
}
case AssetMeta.ValueType.Double => try {
java.lang.Double.parseDouble(value)
true
Some(SolrDoubleValue(java.lang.Double.parseDouble(value)))
} catch {
case _ => false
case _ => None
}
case _ => true
case _ => Some(SolrStringValue(value))
}
}

Expand Down
58 changes: 39 additions & 19 deletions collins/app/util/Solr.scala
Original file line number Diff line number Diff line change
Expand Up @@ -324,35 +324,55 @@ trait SolrSimpleExpr extends SolrExpression {
def AND(k: SolrExpression) = SolrAndOp(this :: k :: Nil)
def OR(k: SolrExpression) = SolrOrOp(this :: k :: Nil)

val nonMetaKeys = List("tag", "created", "updated", "deleted")
val nonMetaKeys = Map(
"tag" -> String,
"created" -> String,
"updated" -> String,
"deleted" -> String
)



val enumKeys = Map(
"assetType" -> AssetType.Enum,
"status" -> Status.Enum
)

def typeLeft(key: String, expected: ValueType, actual: ValueType) = Left("Key %s expects type %s, got %s".format(key, expected.toString, actual.toString))
def typeLeft(key: String, expected: ValueType, actual: ValueType): Either[String, (String, SolrSingleValue)] = Left("Key %s expects type %s, got %s".format(key, expected.toString, actual.toString))


type TypeEither = Either[String, (String, SolrSingleValue)]

/**
* returns Left(error) or Right(solr_key_name)
*/
def typeCheckValue(key: String, value: SolrSingleValue):Either[String, (String, SolrSingleValue)] = if (nonMetaKeys contains key) {
Right(key -> value)
} else enumKeys.get(key).map{enum => value match {
case SolrStringValue(e) => try Right(key -> SolrIntValue(enum.withName(e).id)) catch {
case _ => Left("Invalid %s: %s".format(key, e))
}
case s:SolrIntValue => Right(key -> value)
case other => typeLeft(key, String, other.valueType)
}}.getOrElse(AssetMeta.findByName(key) match {
case Some(meta) => if (meta.valueType == value.valueType) {
//FIXME: perhaps centralize asset meta key formatting
Right(key.toUpperCase + value.postfix -> value)
} else {
typeLeft(key, meta.valueType, value.valueType)
}
case None => Left("Unknown Meta tag \"%s\"".format(key))
})


def typeCheckValue(key: String, value: SolrSingleValue):Either[String, (String, SolrSingleValue)] = {
val a: Option[TypeEither] = nonMetaKeys.get(key).map {valueType =>
if (valueType == value.valueType) {
Right(key -> value) //FIXME no type checking!

} else {
typeLeft(key, valueType, value.valueType)
}
} orElse{enumKeys.get(key).map{enum => value match {
case SolrStringValue(e) => try Right(key -> SolrIntValue(enum.withName(e).id)) catch {
case _ => Left("Invalid %s: %s".format(key, e))
}
case s:SolrIntValue => Right(key -> value) : Either[String, (String, SolrSingleValue)]
case other => typeLeft(key, String, other.valueType)
}}}
a.getOrElse(AssetMeta.findByName(key) match {
case Some(meta) => if (meta.valueType == value.valueType) {
//FIXME: perhaps centralize asset meta key formatting
Right(key.toUpperCase + value.postfix -> value)
} else {
typeLeft(key, meta.valueType, value.valueType)
}
case None => Left("Unknown Meta tag \"%s\"".format(key))
})
}

}

Expand Down

0 comments on commit d363976

Please sign in to comment.