scicloj/tablecloth

order-by no working

Closed this issue · 4 comments

(tc/order-by [:panel-code :output-type-code])

gives exception.
I have unusal column names:
(:panel-code :output-type-code 2020 2021 2022 2023)
keys and lonsg,
maybe thats the reason

[{:type java.lang.ClassCastException
   :message "class clojure.lang.Keyword cannot be cast to class java.lang.String (clojure.lang.Keyword is in unnamed module of loader 'app'; java.lang.String is in module java.base of loader 'bootstrap')"
   :at [java.lang.String compareTo "String.java" 142]}]
 :trace
 [[java.lang.String compareTo "String.java" 142]
  [clojure.lang.Util compare "Util.java" 153]
  [clojure.lang.APersistentVector compareTo "APersistentVector.java" 442]
  [clojure.lang.Util compare "Util.java" 153]
  [clojure.core$compare invokeStatic "core.clj" 842]
  [clojure.core$compare invoke "core.clj" 833]
  [clojure.lang.AFunction compare "AFunction.java" 51]
  [tech.v3.datatype.argops$index_comparator$reify__31810 compareInts "argops.clj" 298]
  [tech.v3.datatype.Comparators$IntComp compare "Comparators.java" 16]
  [it.unimi.dsi.fastutil.ints.IntArrays quickSort "IntArrays.java" 482]
  [it.unimi.dsi.fastutil.ints.IntArrays parallelQuickSort "IntArrays.java" 602]
  [it.unimi.dsi.fastutil.ints.IntArrays parallelQuickSort "IntArrays.java" 621]
  [tech.v3.datatype.argops$argsort invokeStatic "argops.clj" 366]
  [tech.v3.datatype.argops$argsort invoke "argops.clj" 333]
  [tech.v3.dataset.base$sort_by invokeStatic "base.clj" 589]
  [tech.v3.dataset.base$sort_by doInvoke "base.clj" 569]
  [clojure.lang.RestFn invoke "RestFn.java" 445]
  [tech.v3.dataset.base$sort_by invokeStatic "base.clj" 592]
  [tech.v3.dataset.base$sort_by invoke "base.clj" 569]
  [tech.v3.dataset$sort_by invokeStatic "dataset.clj" 1385]
  [tech.v3.dataset$sort_by invoke "dataset.clj" 1366]
  [tablecloth.api.order_by$sort_fn$fn__40515 invoke "order_by.clj" 45]
  [tablecloth.api.order_by$order_by invokeStatic "order_by.clj" 78]
  [tablecloth.api.order_by$order_by invoke "order_by.clj" 56]
  [tablecloth.api.order_by$order_by invokeStatic "order_by.clj" 67]
  [tablecloth.api.order_by$order_by invoke "order_by.clj" 56]
  [tablecloth.api.order_by$order_by invokeStatic "order_by.clj" 66]
  [tablecloth.api.order_by$order_by invoke "order_by.clj" 56]
  [tablecloth.api$order_by invokeStatic "api.clj" 710]
  [tablecloth.api$order_by invoke "api.clj" 699]

It happens when having a mixed column, containing keywords and String values

What about the content? Could you please provide a minimal example of such dataset (few rows). Looks like it belongs to a TMD.

Ok. I think it's expected behaviour. Keywords and strings are not comparable.

(sort [:a :b "c"])

1. Unhandled java.lang.ClassCastException
   class clojure.lang.Keyword cannot be cast to class java.lang.String
   (clojure.lang.Keyword is in unnamed module of loader 'app';
   java.lang.String is in module java.base of loader 'bootstrap')

               String.java:  142  java.lang.String/compareTo
                 Util.java:  153  clojure.lang.Util/compare
                  core.clj:  842  clojure.core/compare
                  core.clj:  833  clojure.core/compare
            AFunction.java:   51  clojure.lang.AFunction/compare
              TimSort.java:  360  java.util.TimSort/countRunAndMakeAscending
              TimSort.java:  220  java.util.TimSort/sort
               Arrays.java: 1234  java.util.Arrays/sort
                  core.clj: 3116  clojure.core/sort
                  core.clj: 3103  clojure.core/sort
                  core.clj: 3103  clojure.core/sort

Ok, we close it.