Skip to content

Commit 4e40959

Browse files
committed
1.0.1: some golfing, added isDecimalDouble check to Decimal128 splitting
2 parents 4bdc095 + dbe5d27 commit 4e40959

File tree

9 files changed

+70
-76
lines changed

9 files changed

+70
-76
lines changed

build.sbt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import scala.collection.Seq
22

3-
performMavenCentralSync in ThisBuild := false
4-
53
publishAsOSSProject in ThisBuild := true
64

75
homepage in ThisBuild := Some(url("https://github.com/slamdata/quasar-datasource-mongo"))

datasource/src/main/scala/quasar/physical/mongo/Mongo.scala

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,7 @@ object Mongo {
9292
}
9393

9494
def unsubscribe(s: Subscription): F[Unit] = F.delay {
95-
if (!s.isUnsubscribed()) {
96-
s.unsubscribe()
97-
} else {
98-
()
99-
}
95+
if (!s.isUnsubscribed()) s.unsubscribe()
10096
}
10197

10298
def enqueueObservable(
@@ -106,7 +102,7 @@ object Mongo {
106102
Stream.eval(F.delay(handler(subVar, { x => run(obsQ.enqueue1(x)) })))
107103

108104
(for {
109-
obsQ <- Stream.eval(Queue.boundedNoneTerminated[F, Either[Throwable, F[A]]](32))
105+
obsQ <- Stream.eval(Queue.boundedNoneTerminated[F, Either[Throwable, F[A]]](1))
110106
subVar <- Stream.eval(MVar[F].empty[Subscription])
111107
_ <- enqueueObservable(obsQ, subVar)
112108
res <- obsQ.dequeue.rethrow.onFinalize(subVar.take.flatMap(unsubscribe))

datasource/src/main/scala/quasar/physical/mongo/decoder.scala

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ package quasar.physical.mongo
1818

1919
import slamdata.Predef._
2020

21+
import cats.syntax.eq._
22+
import cats.instances.string._
23+
2124
import java.lang.ArithmeticException
22-
import java.math.{BigDecimal => JDecimal}
2325
import java.time.{Instant, OffsetDateTime, ZoneOffset}
2426
import java.util.{Map, Iterator}
2527

@@ -60,13 +62,8 @@ object decoder {
6062

6163
}
6264

63-
val qdataDecoder: QDataDecode[BsonValue] = new QDataDecode[BsonValue] {
64-
private val maxLong: JDecimal = BigDecimal.decimal(Long.MaxValue).bigDecimal
65-
private val minLong: JDecimal = BigDecimal.decimal(Long.MinValue).bigDecimal
66-
private val tinyDbl: JDecimal = BigDecimal.decimal(Double.MinPositiveValue).bigDecimal
67-
private val maxDbl: JDecimal = BigDecimal.decimal(Double.MaxValue).bigDecimal
68-
private val minDbl: JDecimal = BigDecimal.decimal(Double.MinValue).bigDecimal
6965

66+
val qdataDecoder: QDataDecode[BsonValue] = new QDataDecode[BsonValue] {
7067
override def tpe(bson: BsonValue): QType = bson.getBsonType() match {
7168
case BsonType.DOCUMENT => QObject
7269
case BsonType.ARRAY => QArray
@@ -75,30 +72,20 @@ object decoder {
7572
case BsonType.INT64 => QLong
7673
case BsonType.DOUBLE => QDouble
7774
case BsonType.DECIMAL128 => {
78-
7975
val dec128: Decimal128 = bson.asDecimal128().getValue()
80-
if (dec128.isNaN()) {
81-
QNull
82-
} else if (dec128.isInfinite()) {
83-
QNull
84-
} else try {
85-
val decimal: JDecimal = dec128.bigDecimalValue()
86-
if (decimal.scale() < 1 && decimal.compareTo(maxLong) < 1 && decimal.compareTo(minLong) > -1) {
87-
QLong
88-
} else {
89-
if (decimal.abs().compareTo(tinyDbl) < 0) {
90-
QReal
91-
} else
92-
if (decimal.compareTo(maxDbl) < 1 && decimal.compareTo(minDbl) > -1) {
93-
QDouble
94-
} else {
95-
QReal
96-
}
97-
}
76+
if (dec128.isNaN()) QNull
77+
else if (dec128.isInfinite()) QNull
78+
else try {
79+
val decimal: BigDecimal = BigDecimal(dec128.bigDecimalValue())
80+
if (decimal.isValidLong) QLong
81+
else if (decimal.isDecimalDouble) QDouble
82+
else QReal
9883
} catch {
99-
case e: ArithmeticException => QLong
84+
case e: ArithmeticException
85+
if e.getMessage() === "Negative zero can not be converted to a BigDecimal" => QLong
10086
}
10187
}
88+
10289
case BsonType.BOOLEAN => QBoolean
10390
case BsonType.OBJECT_ID => QMeta
10491
case BsonType.DB_POINTER => QMeta
@@ -154,7 +141,8 @@ object decoder {
154141
try {
155142
bsonDecimal.longValue()
156143
} catch {
157-
case e: ArithmeticException => 0L
144+
case e: ArithmeticException
145+
if e.getMessage() === "Negative zero can not be converted to a BigDecimal" => 0L
158146
}
159147
case num: BsonNumber => num.longValue()
160148
}

datasource/src/test/scala/quasar/physical/mongo/DecodeProps.scala

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,9 @@ class DecodeProps extends Specification with ScalaCheck {
7777
AsResult(decimal128.isNaN() || decimal128.isInfinite())
7878
.updateMessage("BsonDecimal128 should be decoded to QNull iff it's either NaN or Infinite")
7979
case QReal => {
80-
val bdv = decimal128.bigDecimalValue()
81-
val moreThanMax = AsResult(bdv.compareTo(BigDecimal(Double.MaxValue).bigDecimal) > 0)
82-
val lessThanMin = AsResult(bdv.compareTo(BigDecimal(Double.MinValue).bigDecimal) < 0)
83-
val isTiny = AsResult(bdv.abs().compareTo(BigDecimal(Double.MinPositiveValue).bigDecimal) < 0)
84-
85-
moreThanMax or lessThanMin or isTiny
80+
val bdv = BigDecimal(decimal128.bigDecimalValue())
81+
AsResult(!bdv.isDecimalDouble && !bdv.isValidLong)
82+
.updateMessage("All decimals converted to real shouldn't be valid doubles and longs")
8683
}
8784
case _ => AsResult(false).updateMessage("BsonDecimal128 should be decoded to number")
8885
}

datasource/src/test/scala/quasar/physical/mongo/DecodeSpec.scala

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ class DecodeSpec extends Specification {
289289
val moreThanMaxLong =
290290
new BsonDecimal128(new Decimal128((BigDecimal(Long.MaxValue) + BigDecimal(1L)).bigDecimal))
291291
val lessThanMinLong =
292-
new BsonDecimal128(new Decimal128((BigDecimal(Long.MinValue) + BigDecimal(-1L)).bigDecimal))
292+
new BsonDecimal128(new Decimal128((BigDecimal(Long.MinValue) - BigDecimal(1L)).bigDecimal))
293293
val moreThanMaxDouble =
294294
new BsonDecimal128(new Decimal128(
295295
(BigDecimal(Double.MaxValue) * 1.1).bigDecimal
@@ -298,40 +298,55 @@ class DecodeSpec extends Specification {
298298
new BsonDecimal128(new Decimal128(
299299
(BigDecimal(Double.MinValue) * 1.1).bigDecimal
300300
))
301-
302301
val tinierThanTiny =
303302
new BsonDecimal128(new Decimal128(
304303
(BigDecimal(Double.MinPositiveValue) / 2).bigDecimal
305304
))
305+
val rational =
306+
new BsonDecimal128(new Decimal128(
307+
(BigDecimal(1L) / BigDecimal(3L)).bigDecimal
308+
))
309+
val doubleRational =
310+
new BsonDecimal128(new Decimal128(
311+
BigDecimal(1.0 / 3.0).bigDecimal
312+
))
306313

307-
qdataDecoder.tpe(nan) === QNull
308-
qdataDecoder.tpe(negativeNaN) === QNull
309-
qdataDecoder.tpe(inf) === QNull
310-
qdataDecoder.tpe(negativeInf) === QNull
311-
qdataDecoder.tpe(zero) === QLong
312-
qdataDecoder.tpe(negativeZero) === QLong
313-
qdataDecoder.tpe(maxLong) === QLong
314-
qdataDecoder.tpe(minLong) === QLong
315-
qdataDecoder.tpe(maxDouble) === QDouble
316-
qdataDecoder.tpe(minDouble) === QDouble
317-
qdataDecoder.tpe(tinyDouble) === QDouble
318-
qdataDecoder.tpe(moreThanMaxLong) === QDouble
319-
qdataDecoder.tpe(lessThanMinLong) === QDouble
320-
qdataDecoder.tpe(moreThanMaxDouble) === QReal
321-
qdataDecoder.tpe(lessThanMinDouble) === QReal
322-
qdataDecoder.tpe(tinierThanTiny) === QReal
314+
"tpe" >> {
315+
"nan" >> (qdataDecoder.tpe(nan) === QNull)
316+
"-nan" >> (qdataDecoder.tpe(negativeNaN) === QNull)
317+
"inf" >> (qdataDecoder.tpe(inf) === QNull)
318+
"-inf" >> (qdataDecoder.tpe(negativeInf) === QNull)
319+
"0" >> (qdataDecoder.tpe(zero) === QLong)
320+
"---0" >> (qdataDecoder.tpe(negativeZero) === QLong)
321+
"maxlong" >> (qdataDecoder.tpe(maxLong) === QLong)
322+
"minlong" >> (qdataDecoder.tpe(minLong) === QLong)
323+
"maxdouble" >> (qdataDecoder.tpe(maxDouble) === QDouble)
324+
"mindouble" >> (qdataDecoder.tpe(minDouble) === QDouble)
325+
"tinydouble" >> (qdataDecoder.tpe(tinyDouble) === QDouble)
326+
">maxlong" >> (qdataDecoder.tpe(moreThanMaxLong) === QReal)
327+
"<minLong" >> (qdataDecoder.tpe(lessThanMinLong) === QReal)
328+
">maxdouble" >> (qdataDecoder.tpe(moreThanMaxDouble) === QReal)
329+
"<mindouble" >> (qdataDecoder.tpe(lessThanMinDouble) === QReal)
330+
"abs < tinydouble" >> (qdataDecoder.tpe(tinierThanTiny) === QReal)
331+
"rational" >> (qdataDecoder.tpe(rational) === QReal)
332+
"doublerational" >> (qdataDecoder.tpe(doubleRational) === QDouble)
333+
}
323334

324-
qdataDecoder.getLong(zero) === 0L
325-
qdataDecoder.getLong(negativeZero) === 0L
326-
qdataDecoder.getLong(maxLong) === Long.MaxValue
327-
qdataDecoder.getLong(minLong) === Long.MinValue
328-
qdataDecoder.getDouble(maxDouble) === Double.MaxValue
329-
qdataDecoder.getDouble(minDouble) === Double.MinValue
330-
qdataDecoder.getDouble(tinyDouble) === Double.MinPositiveValue
331-
qdataDecoder.getDouble(moreThanMaxLong) === Long.MaxValue + 1.0
332-
qdataDecoder.getDouble(lessThanMinLong) === Long.MinValue - 1.0
333-
qdataDecoder.getReal(moreThanMaxDouble) === Real(BigDecimal(Double.MaxValue) * 1.1)
334-
qdataDecoder.getReal(lessThanMinDouble) === Real(BigDecimal(Double.MinValue) * 1.1)
335-
qdataDecoder.getReal(tinierThanTiny) === Real(BigDecimal(Double.MinPositiveValue) / 2)
335+
"getValue" >> {
336+
"0" >> (qdataDecoder.getLong(zero) === 0L)
337+
"---0" >> (qdataDecoder.getLong(negativeZero) === 0L)
338+
"maxlong" >> (qdataDecoder.getLong(maxLong) === Long.MaxValue)
339+
"minlong" >> (qdataDecoder.getLong(minLong) === Long.MinValue)
340+
"maxdouble" >> (qdataDecoder.getDouble(maxDouble) === Double.MaxValue)
341+
"mindouble" >> (qdataDecoder.getDouble(minDouble) === Double.MinValue)
342+
"tinydouble" >> (qdataDecoder.getDouble(tinyDouble) === Double.MinPositiveValue)
343+
">maxlong" >> (qdataDecoder.getReal(moreThanMaxLong) === Real(Long.MaxValue) + 1.0)
344+
"<minlong" >> (qdataDecoder.getReal(lessThanMinLong) === Real(Long.MinValue) - 1.0)
345+
">maxdouble" >> (qdataDecoder.getReal(moreThanMaxDouble) === Real(BigDecimal(Double.MaxValue) * 1.1))
346+
"<mindouble" >> (qdataDecoder.getReal(lessThanMinDouble) === Real(BigDecimal(Double.MinValue) * 1.1))
347+
"abs < tinydouble" >> (qdataDecoder.getReal(tinierThanTiny) === Real(BigDecimal(Double.MinPositiveValue) / 2))
348+
"rational" >> (qdataDecoder.getReal(rational) === Real(BigDecimal(1L) / BigDecimal(3L)))
349+
"doublerational" >> (qdataDecoder.getDouble(doubleRational) === 1.0 / 3.0)
350+
}
336351
}
337352
}

project/plugins.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ resolvers += Resolver.sonatypeRepo("releases")
22
resolvers += Resolver.bintrayRepo("slamdata-inc", "maven-public")
33

44
addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.1.0-M7")
5-
addSbtPlugin("com.slamdata" % "sbt-slamdata" % "1.4.0")
5+
addSbtPlugin("com.slamdata" % "sbt-slamdata" % "2.0.0")
66
addSbtPlugin("com.slamdata" % "sbt-quasar-datasource" % "0.0.5")

project/project/plugins.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ resolvers += Resolver.bintrayRepo("slamdata-inc", "maven-public")
33
resolvers += Resolver.bintrayIvyRepo("djspiewak", "ivy")
44

55
addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.1.0-M4")
6-
addSbtPlugin("com.slamdata" % "sbt-slamdata" % "1.4.0")
6+
addSbtPlugin("com.slamdata" % "sbt-slamdata" % "2.0.0")

quasar-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
91.0.7
1+
91.2.0

version.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version in ThisBuild := "1.0.0"
1+
version in ThisBuild := "1.0.1"

0 commit comments

Comments
 (0)