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

add logDetailsParseDQ #6

Merged
merged 1 commit into from
Dec 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
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
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: rcUtils
Type: Package
Title: REDCap Utility Functions
Version: 0.2.0
Version: 0.3.0
Author: Jubilee
Maintainer: Jubilee<hsi-nien.tan@vumc.org>
Description: A collection of reusable functions to streamline and enhance the functionality of REDCap projects. This package includes functions for parsing logging strings, converting data types, and more.
Expand Down
22 changes: 22 additions & 0 deletions R/logParse.R
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,25 @@ logDetailsParseRecordInstance <- function(details) {
}
})
}

logDetailsParseDQ <- function(details) {
dq_log_selctor <- grepl("^(Open|Respond to|Send|Close) data query", details)

pattern <- ',\\s(?=(?:[^"]|"[^"]*")*$)'

actions <- sub("\\s?\\(.*$", "", details)
info <- gsub("^[^\\(]+\\(|\\)$", "", details)
info <- paste0("Action: ", actions, ", ", info)
info[!dq_log_selctor] <- ''
pairs <- strsplit(info, pattern, perl = TRUE)

lapply(pairs, function(x) {
kv <- strsplit(x, ': (?=(?:[^"]|"[^"]*")*$)', perl = TRUE)
kv <- lapply(kv, function(x) gsub('^"|"$', "", x))

as.list(setNames(
unlist(lapply(kv, "[", 2)),
unlist(lapply(kv, "[", 1))
))
})
}
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,40 @@
## Overview
rcUtils is an R library providing utility functions for parsing and analyzing log data. It includes:


## Functions
### logDetailsParseDQ
Parses data query log details into a structured format.

### logDetailsParseRecord
Extracts key-value pairs from log details.

### logDetailsParseRecordInstance
Extracts instance numbers from log details.

### logFilter
Filters log actions based on specified types.


## Installation
```R
```r
# Install from GitHub
devtools::install_github("jubilee2/rcUtils")
```

## Usage
```R
library(rcUtils)

# Example log data
log <- data.frame(
details = c(
"name = 'John', age = '30', hobbies(1) = checked",
"Open data query (Record: 1, Event: \"Event 1\")",
"[instance = 123] name = 'Jane', age = '25', hobbies(2) = unchecked"
)
)

# Parse log details
log$detailObj <- logDetailsParseRecord(log$details)
log$detailObj <- logDetailsParseDQ(log$details)

# Extract instance numbers
log$instance <- logDetailsParseRecordInstance(log$details)
Expand All @@ -42,6 +48,7 @@ log[selected,]

```
## Features
* logDetailsParseDQ: Parses data query log details into a structured format.
* logDetailsParseRecord: Extracts key-value pairs from log details.
* logDetailsParseRecordInstance: Extracts instance numbers from log details.
* logFilter: Filters log actions based on specified types.
Expand Down
22 changes: 22 additions & 0 deletions man/logDetailsParseDQ.Rd
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
\name{logDetailsParseDQ}
\alias{logDetailsParseDQ}
\title{Parse Data Query Log Details}
\description{
Parse data query log details into a structured format.
}
\usage{
logDetailsParseDQ(details)
}
\arguments{
\item{details}{Character vector of log details}
}
\value{
List of parsed log details
}
\examples{
logDetailsParseDQ(c("Open data query (Record: 1, Event: \"Event 1\")"))
}
\seealso{
\code{\link{logDetailsParseDQ}} for related functions
}
\keyword{utilities}
91 changes: 91 additions & 0 deletions tests/testthat/test-logParse.R
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,94 @@ test_that("logDetailsParseRecordInstance returns '1' for NA details", {
expected <- list("1")
expect_equal(result, expected)
})



# Test case 1: Valid data query
test_that("logDetailsParseDQ parses valid data query", {
test_details <- c('Open data query (Record: 1, Event: "Event 1")')
result <- logDetailsParseDQ(test_details)
expected <- list(
list(
Action = "Open data query",
Record = "1",
Event = "Event 1"
)
)
expect_equal(result, expected)
})

# Test case 2: Multiple valid data queries
test_that("logDetailsParseDQ parses multiple valid data queries", {
test_details <- c(
"Open data query (Record: 1, Event: \"Event 1\")",
"Respond to data query (Record: 2, Event: \"Event 2\")"
)
result <- logDetailsParseDQ(test_details)
expected <- list(
list(
Action = "Open data query",
Record = "1",
Event = "Event 1"
),
list(
Action = "Respond to data query",
Record = "2",
Event = "Event 2"
)
)
expect_equal(result, expected)
})

# Test case 3: Invalid data query
test_that("logDetailsParseDQ returns empty list for invalid data query", {
test_details <- c("Invalid log message")
result <- logDetailsParseDQ(test_details)
expected <- list(list())
expect_equal(result, expected)
})

# Test case 4: NA details
test_that("logDetailsParseDQ returns empty list for NA details", {
test_details <- c(NA)
result <- logDetailsParseDQ(test_details)
expected <- list(list())
expect_equal(result, expected)
})

# Test case 5: Empty string
test_that("logDetailsParseDQ returns empty list for empty string", {
test_details <- c("")
result <- logDetailsParseDQ(test_details)
expected <- list(list())
expect_equal(result, expected)
})

# Test case 6: Edge case - quoted value
test_that("logDetailsParseDQ handles quoted values", {
test_details <- c("Open data query (Record: 1, Event: \"Event 1, with comma\")")
result <- logDetailsParseDQ(test_details)
expected <- list(
list(
Action = "Open data query",
Record = "1",
Event = "Event 1, with comma"
)
)
expect_equal(result, expected)
})

# Test case 7: Edge case - multiple quoted values
test_that("logDetailsParseDQ handles multiple quoted values", {
test_details <- c("Open data query (Record: 1, Event: \"Event 1, with comma\", Description: \"Desc 1\")")
result <- logDetailsParseDQ(test_details)
expected <- list(
list(
Action = "Open data query",
Record = "1",
Event = "Event 1, with comma",
Description = "Desc 1"
)
)
expect_equal(result, expected)
})
Loading