Slick dynamically filter by a list of columns and values
up vote
0
down vote
favorite
I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.
In pseudo code, I want to do something like this:
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)
I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.
Is there any way to make such a dynamic filtering in slick?
scala slick
add a comment |
up vote
0
down vote
favorite
I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.
In pseudo code, I want to do something like this:
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)
I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.
Is there any way to make such a dynamic filtering in slick?
scala slick
Maybe it will be easier when you try withquery.filter(x => check(x, column, value))approach.
– Łukasz
yesterday
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.
In pseudo code, I want to do something like this:
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)
I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.
Is there any way to make such a dynamic filtering in slick?
scala slick
I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.
In pseudo code, I want to do something like this:
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)
I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.
Is there any way to make such a dynamic filtering in slick?
scala slick
scala slick
asked yesterday
Gigitsu
11311
11311
Maybe it will be easier when you try withquery.filter(x => check(x, column, value))approach.
– Łukasz
yesterday
add a comment |
Maybe it will be easier when you try withquery.filter(x => check(x, column, value))approach.
– Łukasz
yesterday
Maybe it will be easier when you try with
query.filter(x => check(x, column, value)) approach.– Łukasz
yesterday
Maybe it will be easier when you try with
query.filter(x => check(x, column, value)) approach.– Łukasz
yesterday
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
Yes there is !
I use this method
private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] =
operator match
case "==" => new BaseColumnExtensionMethods(left) === right
case "!=" => new BaseColumnExtensionMethods(left) =!= right
case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
Then you can write something like
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
Yes there is !
I use this method
private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] =
operator match
case "==" => new BaseColumnExtensionMethods(left) === right
case "!=" => new BaseColumnExtensionMethods(left) =!= right
case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
Then you can write something like
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
add a comment |
up vote
1
down vote
Yes there is !
I use this method
private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] =
operator match
case "==" => new BaseColumnExtensionMethods(left) === right
case "!=" => new BaseColumnExtensionMethods(left) =!= right
case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
Then you can write something like
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
add a comment |
up vote
1
down vote
up vote
1
down vote
Yes there is !
I use this method
private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] =
operator match
case "==" => new BaseColumnExtensionMethods(left) === right
case "!=" => new BaseColumnExtensionMethods(left) =!= right
case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
Then you can write something like
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
Yes there is !
I use this method
private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] =
operator match
case "==" => new BaseColumnExtensionMethods(left) === right
case "!=" => new BaseColumnExtensionMethods(left) =!= right
case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
Then you can write something like
val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
answered yesterday
C4stor
5,84121938
5,84121938
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53224182%2fslick-dynamically-filter-by-a-list-of-columns-and-values%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Maybe it will be easier when you try with
query.filter(x => check(x, column, value))approach.– Łukasz
yesterday