From 1426aa98cbd3ff21787d32e436891b3bc5f8db6e Mon Sep 17 00:00:00 2001 From: boB Rudis Date: Fri, 28 Dec 2018 15:22:11 -0500 Subject: [PATCH] ts_generate --- NAMESPACE | 3 +++ R/RcppExports.R | 18 ++++++++++++- R/gen.R | 7 +++++ README.Rmd | 13 ++++++++-- README.md | 73 +++++++++++++++++++++++++++++++++-------------------- man/ULIDgenerate.Rd | 11 +++++--- man/ts_generate.Rd | 18 +++++++++++++ man/unmarshal.Rd | 3 +++ src/RcppExports.cpp | 12 +++++++++ src/ulid-main.cpp | 30 ++++++++++++++++++++-- 10 files changed, 152 insertions(+), 36 deletions(-) create mode 100644 R/gen.R create mode 100644 man/ts_generate.Rd diff --git a/NAMESPACE b/NAMESPACE index 8303ac9..20ab178 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,9 @@ # Generated by roxygen2: do not edit by hand export(ULIDgenerate) +export(generate) +export(ts_generate) +export(ulid_generate) export(unmarshal) importFrom(Rcpp,sourceCpp) useDynLib(ulid, .registration = TRUE) diff --git a/R/RcppExports.R b/R/RcppExports.R index 10d5432..01ac7bc 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -1,9 +1,24 @@ # Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 +#' Generate ULIDs from timestamps +#' +#' This function generates a new [Universally Unique Lexicographically +#' Sortable Identifier](https://github.com/ulid/spec) from a vector of +#' `POSIXct` timestamps. +#' +#' @md +#' @param tsv vector of `POSIXct` values +#' @export +#' @examples +#' ts_generate(as.POSIXct("2017-11-01 15:00:00", origin="1970-01-01")) +ts_generate <- function(tsv) { + .Call(`_ulid_ts_generate`, tsv) +} + #' Generate ULID #' -#' [ULIDgenerate()] generates a new []Universally Unique Lexicographically +#' [ULIDgenerate()] generates a new [Universally Unique Lexicographically #' Sortable Identifier](https://github.com/ulid/spec). #' #' @md @@ -20,6 +35,7 @@ ULIDgenerate <- function(n = 1L) { #' @md #' @param ulids character ULIDs (e.g. created with [ULIDgenerate()]) #' @export +#' @return data frame (tibble) #' @examples #' unmarshal(ULIDgenerate()) unmarshal <- function(ulids) { diff --git a/R/gen.R b/R/gen.R new file mode 100644 index 0000000..a75736c --- /dev/null +++ b/R/gen.R @@ -0,0 +1,7 @@ +#' @rdname ULIDgenerate +#' @export +generate <- ULIDgenerate + +#' @rdname ULIDgenerate +#' @export +ulid_generate <- ULIDgenerate \ No newline at end of file diff --git a/README.Rmd b/README.Rmd index f2fc317..37c50da 100644 --- a/README.Rmd +++ b/README.Rmd @@ -59,7 +59,8 @@ The left-most character must be sorted first, and the right-most character sorte The following functions are implemented: -- `ULIDgenerate`: Generate a time-based ULID +- `ULIDgenerate` / `generate` / `ulid_generate`: Generate a time-based ULID +- `ts_generate`: Generate ULID from timestamps - `unmarshal`: Unmarshal a ULID into a data frame with timestamp and random bitstring columns ## Installation @@ -94,8 +95,16 @@ ulid::ULIDgenerate() (u <- ulid::ULIDgenerate(20)) ``` -### Unmarshall +### Unmarshal ```{r} unmarshal(u) +``` + +### Use defined timestamps + +```{r} +(ut <- ts_generate(as.POSIXct("2017-11-01 15:00:00", origin="1970-01-01"))) + +unmarshal(ut) ``` \ No newline at end of file diff --git a/README.md b/README.md index 1497993..22a8859 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,9 @@ must be used. Within the same millisecond, sort order is not guaranteed The following functions are implemented: - - `ULIDgenerate`: Generate a time-based ULID + - `ULIDgenerate` / `generate` / `ulid_generate`: Generate a time-based + ULID + - `ts_generate`: Generate ULID from timestamps - `unmarshal`: Unmarshal a ULID into a data frame with timestamp and random bitstring columns @@ -91,7 +93,7 @@ packageVersion("ulid") ulid::ULIDgenerate() ``` - ## [1] "0001E2CWNS3ERSFZQ31W4WXVSM" + ## [1] "0001E2D1EVWTN5G7C2244Q8SJ8" ### Many @@ -99,36 +101,51 @@ ulid::ULIDgenerate() (u <- ulid::ULIDgenerate(20)) ``` - ## [1] "0001E2CWNS0ZTZT8N2HBARCQ8F" "0001E2CWNSMQYKTA2DC9M5Q5SG" "0001E2CWNS4SZYS03Z1FXY5THC" "0001E2CWNSS5SJRQESE956SASQ" - ## [5] "0001E2CWNS77P6X1MH1E93S9W8" "0001E2CWNSRYBVT63QPFVCHNJ3" "0001E2CWNS7KTHMJ6JPYDR7P66" "0001E2CWNSZRT8DDV952XAC2HH" - ## [9] "0001E2CWNS7ZF28CQDHHF84TQA" "0001E2CWNSQT8MDESQ6QGF0FBH" "0001E2CWNSRH50VAGBHAVTZ4C5" "0001E2CWNSQMX29P05JA2NRZ1N" - ## [13] "0001E2CWNS0873HP4QQ1VP4MC2" "0001E2CWNS1V29YAKW2GY39E7R" "0001E2CWNSA40H808JCB9ZTY6B" "0001E2CWNSQTZ3Q41V7D6V32XW" - ## [17] "0001E2CWNS9XPF4EG450HH8R9H" "0001E2CWNSHZ15YKJR0VA6TQ8S" "0001E2CWNSRAPRP614BM7VW3BP" "0001E2CWNSTGPN4PF6EKPW5H2A" + ## [1] "0001E2D1EV54P4DCS24WSYX2R1" "0001E2D1EV0D75WQ55XQ9TQ3RS" "0001E2D1EVPZVD2W626E49GHT6" "0001E2D1EVZCCD9DNH3SSTQN3K" + ## [5] "0001E2D1EV6B8SYC81KSMVMM80" "0001E2D1EV5CT6Q9JB5H1SA5RF" "0001E2D1EVZEBD1J5RMGJ9B23S" "0001E2D1EVTX25KJGVGDJ61X5J" + ## [9] "0001E2D1EVAT8T7V54G6ZQCX0F" "0001E2D1EVKRPHHANAZ5A070HN" "0001E2D1EVPZJ1NDV7M27TQBH0" "0001E2D1EVVZ0PAJVS3WY08QA4" + ## [13] "0001E2D1EVZRQGQV0MEK65DKRA" "0001E2D1EVV1KP7XEKSEQDV8XQ" "0001E2D1EVZH19KNXG6GVEKKHP" "0001E2D1EVB7D31MKZQTRQP0S1" + ## [17] "0001E2D1EVTPGNFEYW4MKGHZA1" "0001E2D1EV8SG2BCSFS3G7SXFV" "0001E2D1EV22JE3JZYF8P33PGS" "0001E2D1EVC6X98C3TT0N9B75C" -### Unmarshall +### Unmarshal ``` r unmarshal(u) ``` ## ts rnd - ## 1 2018-12-28 14:00:09 0ZTZT8N2HBARCQ8F - ## 2 2018-12-28 14:00:09 MQYKTA2DC9M5Q5SG - ## 3 2018-12-28 14:00:09 4SZYS03Z1FXY5THC - ## 4 2018-12-28 14:00:09 S5SJRQESE956SASQ - ## 5 2018-12-28 14:00:09 77P6X1MH1E93S9W8 - ## 6 2018-12-28 14:00:09 RYBVT63QPFVCHNJ3 - ## 7 2018-12-28 14:00:09 7KTHMJ6JPYDR7P66 - ## 8 2018-12-28 14:00:09 ZRT8DDV952XAC2HH - ## 9 2018-12-28 14:00:09 7ZF28CQDHHF84TQA - ## 10 2018-12-28 14:00:09 QT8MDESQ6QGF0FBH - ## 11 2018-12-28 14:00:09 RH50VAGBHAVTZ4C5 - ## 12 2018-12-28 14:00:09 QMX29P05JA2NRZ1N - ## 13 2018-12-28 14:00:09 0873HP4QQ1VP4MC2 - ## 14 2018-12-28 14:00:09 1V29YAKW2GY39E7R - ## 15 2018-12-28 14:00:09 A40H808JCB9ZTY6B - ## 16 2018-12-28 14:00:09 QTZ3Q41V7D6V32XW - ## 17 2018-12-28 14:00:09 9XPF4EG450HH8R9H - ## 18 2018-12-28 14:00:09 HZ15YKJR0VA6TQ8S - ## 19 2018-12-28 14:00:09 RAPRP614BM7VW3BP - ## 20 2018-12-28 14:00:09 TGPN4PF6EKPW5H2A + ## 1 2018-12-28 15:21:47 54P4DCS24WSYX2R1 + ## 2 2018-12-28 15:21:47 0D75WQ55XQ9TQ3RS + ## 3 2018-12-28 15:21:47 PZVD2W626E49GHT6 + ## 4 2018-12-28 15:21:47 ZCCD9DNH3SSTQN3K + ## 5 2018-12-28 15:21:47 6B8SYC81KSMVMM80 + ## 6 2018-12-28 15:21:47 5CT6Q9JB5H1SA5RF + ## 7 2018-12-28 15:21:47 ZEBD1J5RMGJ9B23S + ## 8 2018-12-28 15:21:47 TX25KJGVGDJ61X5J + ## 9 2018-12-28 15:21:47 AT8T7V54G6ZQCX0F + ## 10 2018-12-28 15:21:47 KRPHHANAZ5A070HN + ## 11 2018-12-28 15:21:47 PZJ1NDV7M27TQBH0 + ## 12 2018-12-28 15:21:47 VZ0PAJVS3WY08QA4 + ## 13 2018-12-28 15:21:47 ZRQGQV0MEK65DKRA + ## 14 2018-12-28 15:21:47 V1KP7XEKSEQDV8XQ + ## 15 2018-12-28 15:21:47 ZH19KNXG6GVEKKHP + ## 16 2018-12-28 15:21:47 B7D31MKZQTRQP0S1 + ## 17 2018-12-28 15:21:47 TPGNFEYW4MKGHZA1 + ## 18 2018-12-28 15:21:47 8SG2BCSFS3G7SXFV + ## 19 2018-12-28 15:21:47 22JE3JZYF8P33PGS + ## 20 2018-12-28 15:21:47 C6X98C3TT0N9B75C + +### Use defined timestamps + +``` r +(ut <- ts_generate(as.POSIXct("2017-11-01 15:00:00", origin="1970-01-01"))) +``` + + ## [1] "0001CZM6DG91GGPEZMYZ1TNKH3" + +``` r +unmarshal(ut) +``` + + ## ts rnd + ## 1 2017-11-01 15:00:00 91GGPEZMYZ1TNKH3 diff --git a/man/ULIDgenerate.Rd b/man/ULIDgenerate.Rd index 5b89246..23732b9 100644 --- a/man/ULIDgenerate.Rd +++ b/man/ULIDgenerate.Rd @@ -1,17 +1,22 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R +% Please edit documentation in R/RcppExports.R, R/gen.R \name{ULIDgenerate} \alias{ULIDgenerate} +\alias{generate} +\alias{ulid_generate} \title{Generate ULID} \usage{ ULIDgenerate(n = 1L) + +generate(n = 1L) + +ulid_generate(n = 1L) } \arguments{ \item{n}{number of id's to generate (default = \code{1})} } \description{ -\code{\link[=ULIDgenerate]{ULIDgenerate()}} generates a new []Universally Unique Lexicographically -Sortable Identifier](https://github.com/ulid/spec). +\code{\link[=ULIDgenerate]{ULIDgenerate()}} generates a new \href{https://github.com/ulid/spec}{Universally Unique Lexicographically Sortable Identifier}. } \examples{ ULIDgenerate() diff --git a/man/ts_generate.Rd b/man/ts_generate.Rd new file mode 100644 index 0000000..e3904aa --- /dev/null +++ b/man/ts_generate.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/RcppExports.R +\name{ts_generate} +\alias{ts_generate} +\title{Generate ULIDs from timestamps} +\usage{ +ts_generate(tsv) +} +\arguments{ +\item{tsv}{vector of \code{POSIXct} values} +} +\description{ +This function generates a new \href{https://github.com/ulid/spec}{Universally Unique Lexicographically Sortable Identifier} from a vector of +\code{POSIXct} timestamps. +} +\examples{ +ts_generate(as.POSIXct("2017-11-01 15:00:00", origin="1970-01-01")) +} diff --git a/man/unmarshal.Rd b/man/unmarshal.Rd index 748f8cd..2f0adad 100644 --- a/man/unmarshal.Rd +++ b/man/unmarshal.Rd @@ -9,6 +9,9 @@ unmarshal(ulids) \arguments{ \item{ulids}{character ULIDs (e.g. created with \code{\link[=ULIDgenerate]{ULIDgenerate()}})} } +\value{ +data frame (tibble) +} \description{ Unmarshal a ULID into a data frame with timestamp and random bitstring columns } diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 8dee385..316fdf6 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -5,6 +5,17 @@ using namespace Rcpp; +// ts_generate +CharacterVector ts_generate(Rcpp::DatetimeVector tsv); +RcppExport SEXP _ulid_ts_generate(SEXP tsvSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::DatetimeVector >::type tsv(tsvSEXP); + rcpp_result_gen = Rcpp::wrap(ts_generate(tsv)); + return rcpp_result_gen; +END_RCPP +} // ULIDgenerate CharacterVector ULIDgenerate(long n); RcppExport SEXP _ulid_ULIDgenerate(SEXP nSEXP) { @@ -29,6 +40,7 @@ END_RCPP } static const R_CallMethodDef CallEntries[] = { + {"_ulid_ts_generate", (DL_FUNC) &_ulid_ts_generate, 1}, {"_ulid_ULIDgenerate", (DL_FUNC) &_ulid_ULIDgenerate, 1}, {"_ulid_unmarshal", (DL_FUNC) &_ulid_unmarshal, 1}, {NULL, NULL, 0} diff --git a/src/ulid-main.cpp b/src/ulid-main.cpp index 20ba007..57e5b4d 100644 --- a/src/ulid-main.cpp +++ b/src/ulid-main.cpp @@ -4,9 +4,34 @@ using namespace Rcpp; +//' Generate ULIDs from timestamps +//' +//' This function generates a new [Universally Unique Lexicographically +//' Sortable Identifier](https://github.com/ulid/spec) from a vector of +//' `POSIXct` timestamps. +//' +//' @md +//' @param tsv vector of `POSIXct` values +//' @export +//' @examples +//' ts_generate(as.POSIXct("2017-11-01 15:00:00", origin="1970-01-01")) +// [[Rcpp::export]] +CharacterVector ts_generate(Rcpp::DatetimeVector tsv) { + CharacterVector c(tsv.size()); + for (long i=0; i(tsv[i]); + ulid::EncodeTime(t, u); + ulid::EncodeEntropyRand(u); + c[i] = ulid::Marshal(u); + } + return(c); +} + + //' Generate ULID //' -//' [ULIDgenerate()] generates a new []Universally Unique Lexicographically +//' [ULIDgenerate()] generates a new [Universally Unique Lexicographically //' Sortable Identifier](https://github.com/ulid/spec). //' //' @md @@ -29,13 +54,14 @@ CharacterVector ULIDgenerate(long n=1) { //' @md //' @param ulids character ULIDs (e.g. created with [ULIDgenerate()]) //' @export +//' @return data frame (tibble) //' @examples //' unmarshal(ULIDgenerate()) // [[Rcpp::export]] DataFrame unmarshal(std::vector ulids) { unsigned long sz = ulids.size(); - std::vector dt(sz); + Rcpp::DatetimeVector dt(sz); std::vector cv(sz); for (unsigned long i=0; i