2014-06-24 7 views
4

주소로 일을하고 있습니다. 서브 프리미엄 (아파트/콘도 #)은 검색을 실패하게 만듭니다. null이 될 수도 있기 때문에 subpremise에 대한 고유 한 인덱스 제약 조건의 일부가 될 우려가 있습니다.Slick에서 Options 회원을 올바르게 비교하려면 어떻게해야합니까?

실패 필터 :

tableQuery.filter(c=> (c.longitude === r.longitude && c.latitude === r.latitude) || 
     (c.streetNumber === r.streetNumber && c.route === r.route && c.subpremise === r.subpremise && c.neighborhoodId === r.neighborhoodId)) 

성공 필터 : (removung subpremise로) 내가 s.t. 아래의 정의를 포함 시켰습니다

tableQuery.filter(c=> (c.longitude === r.longitude && c.latitude === r.latitude) || 
      (c.streetNumber === r.streetNumber && c.route === r.route && c.neighborhoodId === r.neighborhoodId)) 

내가 놓친 또 다른 공헌 요인이 있다면 잘하면 주목할 것입니다.

case class Address(id:Option[Long],streetNumber:Short,route:String,subpremise:Option[String],neighborhoodId:Fk,latitude:Option[Double],longitude:Option[Double]) 

class Addresses(tag: Tag) extends Table[Address](tag, "addresses") with Logging { 
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc) 
    def streetNumber = column[Short]("street_number") 
    def route = column[String]("route",O.NotNull) 
    def subpremise = column[Option[String]]("subpremise") 
    def neighborhoodId = column[Long]("neighborhood",O.NotNull) 
    def latitude = column[Option[Double]]("latitude") 
    def longitude = column[Option[Double]]("longitude") 

    //Constraints 
    def idx = index("idx_streetnum_route_subpremise_neighborhood", (streetNumber,route,subpremise,neighborhoodId), unique = true) 
    def gps = index("gps", (latitude,longitude), unique = true) 

    //Foreign Key 
    def neighborhood = foreignKey("NEIGHBORHOOD_FK", neighborhoodId, Neighborhoods.tableQuery)(_.id) 

    def * = (id.?,streetNumber,route,subpremise,neighborhoodId,latitude,longitude) <> (Address.tupled,Address.unapply) 
} 
+1

향후 독자를 위해이 코드 (즉, 문제와 직접적으로 관련이없는 모든 것 --- 모든 추가 필드)를 제거하는 것이 좋습니다. –

답변

2

대답은 다음 검사를 사용하는 것이 었습니다.

(//Option Scenario both are defined 
    (c.subpremise.isDefined && r.subpremise.isDefined && c.subpremise === r.subpremise) || 
    //Option Scenario both are empty 
    (c.subpremise.isEmpty && r.subpremise.isEmpty) 
) 
+2

아마도'isDefined'를 체크하지 않아도됩니다 :'c.optField === r.optField || (c.optField.isEmpty && r.optField.isEmpty) ' –

+0

AaronNovstrup 당신이 100 % 맞습니다, 그냥 확인/테스트. 감사!! – jordan3

+3

* 왜 * 중복 체크가 필요한지 설명하는 것이 도움이 될 것입니다. 다행스럽게도 Slick/SQL 전문가는 그러한 대답을 제시 할 것이지만 SQL의 3 가지 논리를 수행해야한다고 생각합니다. 값이 NULL이면 3 값 논리의 항등 비교는 '참'을 반환하지 않습니다. –