[ 
https://issues.apache.org/jira/browse/CASSANDRA-19546?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Cheng Wang updated CASSANDRA-19546:
-----------------------------------
    Authors: Cheng Wang, Stefan Miklosovic  (was: Cheng Wang)

> Add format_bytes and format_time functions
> ------------------------------------------
>
>                 Key: CASSANDRA-19546
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-19546
>             Project: Apache Cassandra
>          Issue Type: New Feature
>          Components: Legacy/CQL
>            Reporter: Stefan Miklosovic
>            Assignee: Cheng Wang
>            Priority: Normal
>             Fix For: 5.x
>
>          Time Spent: 3h 50m
>  Remaining Estimate: 0h
>
> There are cases (e.g in our system_views tables but might be applicable for 
> user tables as well) when a column is of a type which represents number of 
> bytes. However, it is quite hard to parse a value for a human to have some 
> estimation what that value is. This function looks at values in a column as 
> if it was in bytes, and it will convert it to whatever a user pleases. 
> Supported units are: {{{}B{}}}, {{{}KiB{}}}, {{MiB}} and {{{}GiB{}}}. The 
> result will be rounded to two decimal places.
> I propose this:
> {code:java}
> CREATE TABLE ks.tb (
>     id int PRIMARY KEY,
>     val bigint
> ) {code}
>  
> {code:java}
> cqlsh> select * from ks.tb;
>  id | val
> ----+----------------
>   5 |          60000
>   1 |        1234234
>   2 | 12342341234234
>   4 |          60001
>   7 |           null
>   6 |             43
>   3 |         123423 {code}
> {code:java}
> cqlsh> select format_bytes(val) from ks.tb;
>  system.format_bytes(val)
> --------------------------
>                 58.59 KiB
>                  1.18 MiB
>               11494.7 GiB
>                 58.59 KiB
>                      null
>                      43 B
>                120.53 KiB{code}
> I also propose that this format_bytes function (name of it might be indeed 
> discussed and it is just a suggestion) should be only applicable for int, 
> smallint, bigint and varint types. I am not sure how to apply this to e.g. 
> "float" or similar. As I mentioned, it is meant to convert just number of 
> bytes, which is just some number, to a string representation of that and I do 
> not think that applying that function to anything else but these types makes 
> sense.
> The second way to call {{format_bytes}} functions is to specify into what 
> size unit we would like to see all values to be converted to. For example, we 
> want all size to be represented in mebibytes, hence we do:
> {code:java}
> cqlsh> select format_bytes(val, 'MiB') from ks.tb;
>  system.format_bytes(val, 'MiB')
> ----------------------------------
>                         0.06 MiB
>                         1.18 MiB
>                  11770573.84 MiB
>                         0.06 MiB
>                             null
>                            0 MiB
>                         0.12 MiB {code}
> Lastly, we can specify a source unit and a target unit. A source unit tells 
> what unit that column is logically of, the target unit tells what unit we 
> want these values to be converted to. For example, if we know that our column 
> is logically in kibibytes and we want them to be converted into mebibytes, we 
> would do:
>  
> {code:java}
> cqlsh> select format_bytes(val, 'Kib', 'MiB') from ks.tb;
>  system.format_bytes(val, 'KiB', 'MiB')
> ----------------------------------------
>                               58.59 MiB
>                             1205.31 MiB
>                      12053067611.56 MiB
>                               58.59 MiB
>                                    null
>                                0.04 MiB
>                              120.53 MiB {code}
>  
>  
> Similarly to {*}{{format_bytes}}{*}, we can do transformations on 
> duration-like columns, namely {*}format_time{*}.
> Supported units are: {{{}d{}}}, {{{}h{}}}, {{{}m{}}}, {{{}s{}}}, {{{}ms{}}}, 
> {{{}us{}}}, {{{}µs{}}}, {{{}ns{}}}. Supported column types on which this 
> function is possible to be applied: {{{}INT{}}}, {{{}TINYINT{}}}, 
> {{{}SMALLINT{}}}, {{{}BIGINT{}}}, {{{}VARINT{}}}, {{{}ASCII{}}}, 
> {{{}TEXT{}}}. For {{ASCII}} and {{TEXT}} types, text of such column has to be 
> a non-negative number. The result will be rounded to two decimal places.
> {code:java}
> cqlsh> select format_time(val) from ks.tb;
>  system.format_time(val)
> -------------------------
>                      1 m
>                  20.57 m
>              142851.17 d
>                      1 m
>                     null
>                    43 ms
>                   2.06 m {code}
> We may specify what unit we want that value to be converted to, give the 
> column’s values are in milliseconds:
> {code:java}
> cqlsh> select format_time(val, 'm') from ks.tb;
>  system.format_time(val, 'm')
> ------------------------------
>                           1 m
>                       20.57 m
>                205705687.24 m
>                           1 m
>                          null
>                           0 m
>                        2.06 m {code}
> Lastly, we can specify both source and target values:
> {code:java}
> cqlsh> select format_time(val, 's', 'h') from ks.tb;
>  system.format_time(val, 's', 'h')
> -----------------------------------
>                            16.67 h
>                           342.84 h
>                    3428428120.62 h
>                            16.67 h
>                               null
>                             0.01 h
>                            34.28 h {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to