Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

misc(query): Utility to convert ColumnFilters in LogicalPlan #751

Merged
merged 7 commits into from
May 21, 2020
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Add test class
  • Loading branch information
jackson-paul committed May 21, 2020
commit 4f9b85f06e305875e5cfd6d1d085e1b734b731fc
152 changes: 152 additions & 0 deletions query/src/test/scala/filodb/query/LogicalPlanSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package filodb.query

import filodb.core.query.{ColumnFilter, RangeParams}
import filodb.core.query.Filter.{Equals, EqualsRegex, In, NotEquals, NotEqualsRegex}
import filodb.query.BinaryOperator.DIV
import filodb.query.Cardinality.OneToOne
import filodb.query.RangeFunctionId.SumOverTime
import org.scalatest.{FunSpec, Matchers}

class LogicalPlanSpec extends FunSpec with Matchers {

it("should get labelValueOps from logicalPlan") {

val rawSeries = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName")),
ColumnFilter("instance", NotEquals("Inst-0"))), Seq("_name_", "instance"), Some(300000), None)
val periodicSeriesWithWindowing = PeriodicSeriesWithWindowing(rawSeries, 1000, 500, 5000, 100, SumOverTime)

val res = LogicalPlan.getLabelValueOperatorsFromLogicalPlan(periodicSeriesWithWindowing)
res.get.size.shouldEqual(1)
res.get(0).labelValueOperators.size.shouldEqual(2)
res.get(0).labelValueOperators(0).columnName.shouldEqual("_name_")
res.get(0).labelValueOperators(0).value.shouldEqual(Seq("MetricName"))
res.get(0).labelValueOperators(0).operator.shouldEqual("=")
res.get(0).labelValueOperators(1).columnName.shouldEqual("instance")
res.get(0).labelValueOperators(1).value.shouldEqual(Seq("Inst-0"))
res.get(0).labelValueOperators(1).operator.shouldEqual("!=")
}

it("should get labelValueOps from logicalPlan with filter In") {

val rawSeries = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName")),
ColumnFilter("instance", In(Set("Inst-1", "Inst-0")))), Seq("_name_", "instance"), Some(300000), None)
val periodicSeriesWithWindowing = PeriodicSeriesWithWindowing(rawSeries, 1000, 500, 5000, 100, SumOverTime)

val res = LogicalPlan.getLabelValueOperatorsFromLogicalPlan(periodicSeriesWithWindowing)
res.get.size.shouldEqual(1)
res.get(0).labelValueOperators.size.shouldEqual(2)
res.get(0).labelValueOperators(0).columnName.shouldEqual("_name_")
res.get(0).labelValueOperators(0).value.shouldEqual(Seq("MetricName"))
res.get(0).labelValueOperators(0).operator.shouldEqual("=")
res.get(0).labelValueOperators(1).columnName.shouldEqual("instance")
res.get(0).labelValueOperators(1).value.shouldEqual(Seq("Inst-0", "Inst-1"))
res.get(0).labelValueOperators(1).operator.shouldEqual("in")
}

it("should get labelValueOps from BinaryJoin LogicalPlan") {

val rawSeriesLhs = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName1")),
ColumnFilter("instance", EqualsRegex("Inst-0"))), Seq("_name_", "instance"), Some(300000), None)
val lhs = PeriodicSeries(rawSeriesLhs, 1000, 500, 50000)

val rawSeriesRhs = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("job", Equals("MetricName2")),
ColumnFilter("instance", NotEqualsRegex("Inst-1"))), Seq("job", "instance"), Some(300000), None)
val rhs = PeriodicSeries(rawSeriesRhs, 1000, 500, 50000)

val binaryJoin = BinaryJoin(lhs, DIV, OneToOne, rhs)

val res = LogicalPlan.getLabelValueOperatorsFromLogicalPlan(binaryJoin)
res.get.size.shouldEqual(2)
res.get(0).labelValueOperators.size.shouldEqual(2)
res.get(0).labelValueOperators(0).columnName.shouldEqual("_name_")
res.get(0).labelValueOperators(0).value.shouldEqual(Seq("MetricName1"))
res.get(0).labelValueOperators(0).operator.shouldEqual("=")
res.get(0).labelValueOperators(1).columnName.shouldEqual("instance")
res.get(0).labelValueOperators(1).value.shouldEqual(Seq("Inst-0"))
res.get(0).labelValueOperators(1).operator.shouldEqual("=~")
res.get(1).labelValueOperators.size.shouldEqual(2)
res.get(1).labelValueOperators(0).columnName.shouldEqual("job")
res.get(1).labelValueOperators(0).value.shouldEqual(Seq("MetricName2"))
res.get(1).labelValueOperators(0).operator.shouldEqual("=")
res.get(1).labelValueOperators(1).columnName.shouldEqual("instance")
res.get(1).labelValueOperators(1).value.shouldEqual(Seq("Inst-1"))
res.get(1).labelValueOperators(1).operator.shouldEqual("!~")
}

it("should get labelValueOps fail for scalar logicalPlan") {
val periodicSeriesWithWindowing = ScalarTimeBasedPlan(ScalarFunctionId.Year, RangeParams(1000, 500, 5000))
val res = LogicalPlan.getLabelValueOperatorsFromLogicalPlan(periodicSeriesWithWindowing)
res.isEmpty should be (true)
intercept[NoSuchElementException] { res.get }
}

it("should get MetricName fail for scalar logicalPlan") {
val periodicSeriesWithWindowing = ScalarTimeBasedPlan(ScalarFunctionId.Year, RangeParams(1000, 500, 5000))
val res = LogicalPlan.getLabelValueFromLogicalPlan(periodicSeriesWithWindowing, "_name_")
res.isEmpty should be (true)
intercept[NoSuchElementException] { res.get }
}

it("should get MetricName from logicalPlan") {

val rawSeries = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName")),
ColumnFilter("instance", Equals("Inst-0"))), Seq("_name_", "instance"), Some(300000), None)
val periodicSeriesWithWindowing = PeriodicSeriesWithWindowing(rawSeries, 1000, 500, 5000, 100, SumOverTime)

val res = LogicalPlan.getLabelValueFromLogicalPlan(periodicSeriesWithWindowing, "_name_")
res.get.shouldEqual(Seq("MetricName"))
}

it("should get LabelName from logicalPlan with filter In") {

val rawSeries = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName")),
ColumnFilter("instance", In(Set("Inst-0", "Inst-1")))), Seq("_name_", "instance"), Some(300000), None)
val periodicSeriesWithWindowing = PeriodicSeriesWithWindowing(rawSeries, 1000, 500, 5000, 100, SumOverTime)

val res = LogicalPlan.getLabelValueFromLogicalPlan(periodicSeriesWithWindowing, "instance")
res.get.shouldEqual(Seq("Inst-0", "Inst-1"))
}

it("should get MetricName from BinaryJoin LogicalPlan") {

val rawSeriesLhs = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName1")),
ColumnFilter("instance", Equals("Inst-0"))), Seq("_name_", "instance"), Some(300000), None)
val lhs = PeriodicSeries(rawSeriesLhs, 1000, 500, 50000)

val rawSeriesRhs = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("job", Equals("MetricName2")),
ColumnFilter("instance", Equals("Inst-1"))), Seq("job", "instance"), Some(300000), None)
val rhs = PeriodicSeries(rawSeriesRhs, 1000, 500, 50000)

val binaryJoin = BinaryJoin(lhs, DIV, OneToOne, rhs)

val res = LogicalPlan.getLabelValueFromLogicalPlan(binaryJoin, "_name_")
res.get.shouldEqual(Seq("MetricName1"))
}

it("should return None if label value is not present in logicalPlan") {

val rawSeries = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName")),
ColumnFilter("instance", Equals("Inst-0"))), Seq("_name_", "instance"), Some(300000), None)
val periodicSeriesWithWindowing = PeriodicSeriesWithWindowing(rawSeries, 1000, 500, 5000, 100, SumOverTime)

val res = LogicalPlan.getLabelValueFromLogicalPlan(periodicSeriesWithWindowing, "_name")
res.isEmpty shouldEqual(true)
}

it("should concatenate results from lhs and rhs for BinaryJoin LogicalPlan") {

val rawSeriesLhs = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("_name_", Equals("MetricName1")),
ColumnFilter("instance", Equals("Inst-0"))), Seq("_name_", "instance"), Some(300000), None)
val lhs = PeriodicSeries(rawSeriesLhs, 1000, 500, 50000)

val rawSeriesRhs = RawSeries(IntervalSelector(1000, 3000), Seq(ColumnFilter("job", Equals("MetricName2")),
ColumnFilter("instance", Equals("Inst-1"))), Seq("job", "instance"), Some(300000), None)
val rhs = PeriodicSeries(rawSeriesRhs, 1000, 500, 50000)

val binaryJoin = BinaryJoin(lhs, DIV, OneToOne, rhs)

val res = LogicalPlan.getLabelValueFromLogicalPlan(binaryJoin, "instance")
res.get.shouldEqual(Seq("Inst-0", "Inst-1"))
}

}