Skip to content
This repository has been archived by the owner on Jun 20, 2024. It is now read-only.

Commit

Permalink
Start work on adding point fields to slashem.
Browse files Browse the repository at this point in the history
  • Loading branch information
Holden Karau committed Oct 20, 2011
1 parent 38b410d commit d04afef
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 2 deletions.
39 changes: 39 additions & 0 deletions src/main/scala/com/foursquare/slashem/Schema.scala
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,7 @@ class SlashemIntListField[T <: Record[T]](owner: T) extends IntListField[T](owne
}
}
}
class SlashemPointField[T <: Record[T]](owner: T) extends PointField[T](owner) with SlashemField[Pair[Double,Double], T]
class SlashemBooleanField[T <: Record[T]](owner: T) extends BooleanField[T](owner) with SlashemField[Boolean, T]
class SlashemDateTimeField[T <: Record[T]](owner: T) extends JodaDateTimeField[T](owner) with SlashemField[DateTime, T]
//More restrictive type so we can access the geohash
Expand Down Expand Up @@ -759,6 +760,44 @@ class IntListField[T <: Record[T]](override val owner: T) extends Field[List[Int
def value() = e getOrElse Nil
override def valueBox() = e
}
class PointField[T <: Record[T]](override val owner: T) extends Field[Pair[Double, Double], T] {
type ValueType = Pair[Double, Double]
var e: Box[ValueType] = Empty

def setFromString(s: String) = {
val doubles = s.split(",").map(x => x.toDouble).toList
doubles.length match {
case 2 => Full(set(Pair(doubles.apply(0),doubles.apply(1))))
case _ => Empty
}
}
override def setFromAny(a: Any) ={
try {
a match {
case "" => Empty
case ar: Array[Double] => Full(set(Pair(ar.apply(0),ar.apply(1))))
case s: String => setFromString(s)
case _ => Empty
}
} catch {
case _ => Empty
}
}
override def setFromJValue(jv: net.liftweb.json.JsonAST.JValue) = Empty
override def liftSetFilterToBox(a: Box[ValueType]) = Empty
override def toBoxMyType(a: ValueType) = Empty
override def defaultValueBox = Empty
override def toValueType(a: Box[MyType]) = null.asInstanceOf[ValueType]
override def asJValue() = net.liftweb.json.JsonAST.JNothing
override def asJs() = net.liftweb.http.js.JE.JsNull
override def toForm = Empty
override def set(a: ValueType) = {e = Full(a)
a.asInstanceOf[ValueType]}
override def get() = e.get
override def is() = e.get
def value() = e getOrElse Nil
override def valueBox() = e
}
class DummyField[V, T <: Record[T]](override val owner: T) extends Field[V, T] {
override def setFromString(s: String): Box[V] = Empty
override def setFromAny(a: Any): Box[V] = Empty
Expand Down
58 changes: 57 additions & 1 deletion src/test/scala/com/foursquare/slashem/ElasticQueryTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import org.specs.matcher.ScalaCheckMatchers

import org.elasticsearch.node.NodeBuilder._
import org.elasticsearch.node.Node
import org.elasticsearch.client.Requests;
import org.elasticsearch.common.xcontent.XContentFactory._;
import java.util.UUID;

Expand Down Expand Up @@ -73,17 +74,62 @@ class ElasticQueryTest extends SpecsMatchers with ScalaCheckMatchers {
Assert.assertTrue(r2.response.results.apply(0).score.value > r1.response.results.apply(0).score.value)
}

@Test
def testGeoBoost {
val r1 = ESimpleGeoPanda where (_.name contains "lolerskates") fetch()
val r2 = ESimpleGeoPanda where (_.name contains "lolerskates") fetch()
}

@Before
def hoboPrepIndex() {
ESimplePanda.meta.node = ElasticNode.node
ESimpleGeoPanda.meta.node = ElasticNode.node
val client = ESimplePanda.meta.client


//Set up the geo panda index
val geoClient = ESimpleGeoPanda.meta.client
try {
val indexReq = Requests.createIndexRequest(ESimpleGeoPanda.meta.indexName)
geoClient.admin.indices().create(indexReq).actionGet()
geoClient.admin().indices().prepareRefresh().execute().actionGet()
val geoPandaIndexName = ESimpleGeoPanda.meta.indexName
val mapping = """
{ "slashemdoc" :{
"properties" : {
"pos" : { type: "geo_point" }
}
}}"""
val mappingReq = Requests.putMappingRequest(ESimpleGeoPanda.meta.indexName).source(mapping).`type`("slashemdoc")
val mappingResponse = geoClient.admin().indices().putMapping(mappingReq).actionGet()
} catch {
case _ => println("Error creating geopanda stuff, may allready exist")
}
geoClient.admin().indices().prepareRefresh().execute().actionGet()
val geodoc1 = geoClient.prepareIndex(ESimpleGeoPanda.meta.indexName,ESimpleGeoPanda.meta.docType,"4c809f4251ada1cdc3790b10").setSource(jsonBuilder()
.startObject()
.field("name","lolerskates")
.field("pos",74,-32)
.endObject()
).execute()
.actionGet();
val geodoc2 = geoClient.prepareIndex(ESimpleGeoPanda.meta.indexName,ESimpleGeoPanda.meta.docType,"4c809f4251ada1cdc3790b11").setSource(jsonBuilder()
.startObject()
.field("name","lolerskates")
.field("pos",74,-31)
.endObject()
).execute()
.actionGet();


//Set up the regular pandas
val r = client.prepareIndex(ESimplePanda.meta.indexName,ESimplePanda.meta.docType,"4c809f4251ada1cdc3790b10").setSource(jsonBuilder()
.startObject()
.field("name","lolerskates")
.endObject()
).execute()
.actionGet();

val r2 = client.prepareIndex(ESimplePanda.meta.indexName,ESimplePanda.meta.docType,"4c809f4251ada1cdc3790b11").setSource(jsonBuilder()
.startObject()
.field("name","loler skates")
Expand Down Expand Up @@ -111,10 +157,20 @@ class ElasticQueryTest extends SpecsMatchers with ScalaCheckMatchers {
.actionGet();

client.admin().indices().prepareRefresh().execute().actionGet()
geoClient.admin().indices().prepareRefresh().execute().actionGet()

}
@After
def hoboDone() {
//TODO: Delete everything from the index
ESimplePanda.meta.node = ElasticNode.node
ESimpleGeoPanda.meta.node = ElasticNode.node
val client = ESimplePanda.meta.client
//Set up the geo panda index
val geoClient = ESimpleGeoPanda.meta.client
val geoIndexDelReq = Requests.deleteIndexRequest(ESimpleGeoPanda.meta.indexName)
val indexDelReq = Requests.deleteIndexRequest(ESimplePanda.meta.indexName)
geoClient.admin.indices().delete(geoIndexDelReq)
client.admin.indices().delete(indexDelReq)
}

}
3 changes: 2 additions & 1 deletion src/test/scala/com/foursquare/slashem/ElasticTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ object ESimpleGeoPanda extends ESimpleGeoPanda with ElasticMeta[ESimpleGeoPanda]
//Force local for testing
override val useTransport = false
override val clusterName = "simpletest" //Override me knthx

override val indexName = "geopanda"
}
class ESimpleGeoPanda extends ElasticSchema[ESimpleGeoPanda] {
def meta = ESimpleGeoPanda
object default extends SlashemDefaultStringField(this)
object id extends SlashemObjectIdField(this)
object name extends SlashemStringField(this)
object score extends SlashemDoubleField(this)
object pos extends SlashemPointField(this)
}

0 comments on commit d04afef

Please sign in to comment.