Skip to content

Commit 708c053

Browse files
committed
Fixed bug with several not empty
1 parent 9dace59 commit 708c053

File tree

6 files changed

+54
-16
lines changed

6 files changed

+54
-16
lines changed

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/Rule.scala

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package uk.gov.nationalarchives.csv.validator.schema
1111
import org.joda.time.DateTime
1212
import uk.gov.nationalarchives.csv.validator.metadata.Row
1313

14+
import scala.collection.mutable.MutableList
1415
import scala.util.Try
1516
import scala.util.parsing.input.Positional
1617
import scalaz._
@@ -22,10 +23,37 @@ abstract class Rule(name: String, val argProviders: ArgProvider*) extends Positi
2223

2324
var explicitColumn: Option[ColumnReference] = None
2425

26+
def findColumnReference(): Option[ColumnReference] = {
27+
if (explicitColumns.nonEmpty){
28+
val index = explicitColumnIndex
29+
val result = explicitColumns.get(index)
30+
if (index + 1 == explicitColumns.length)
31+
explicitColumnIndex = 0
32+
else
33+
explicitColumnIndex = index + 1
34+
result
35+
}
36+
else{
37+
explicitColumn = None
38+
None
39+
}
40+
}
41+
42+
43+
def findColumnRefence(rule: Rule): Option[ColumnReference] =
44+
rule.findColumnReference()
45+
46+
var explicitColumnIndex = 0
47+
48+
val explicitColumns: MutableList[ColumnReference] = MutableList()
49+
2550
def evaluate(columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): RuleValidation[Any] = {
26-
if (valid(cellValue(columnIndex, row, schema), schema.columnDefinitions(columnIndex), columnIndex, row, schema, mayBeLast)) true.successNel[String] else fail(columnIndex, row, schema)
51+
if (valid(cellValue(columnIndex, row, schema), schema.columnDefinitions(columnIndex), columnIndex, row, schema, mayBeLast))
52+
true.successNel[String]
53+
else fail(columnIndex, row, schema)
2754
}
2855

56+
2957
def valid(cellValue: String, columnDefinition: ColumnDefinition, columnIndex: Int,
3058
row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): Boolean =
3159
evaluate(columnIndex, row, schema).isSuccess
@@ -36,15 +64,18 @@ abstract class Rule(name: String, val argProviders: ArgProvider*) extends Positi
3664
s"$toError fails for line: ${row.lineNumber}, column: ${columnDefinition.id}, ${toValueError(row,columnIndex)}".failureNel[Any]
3765
}
3866

39-
def cellValue(columnIndex: Int, row: Row, schema: Schema): String = explicitColumn match {
40-
case Some(columnRef) =>
41-
columnRef.referenceValueEx(columnIndex, row, schema)
42-
case None =>
43-
row.cells(columnIndex).value
67+
def cellValue(columnIndex: Int, row: Row, schema: Schema): String = {
68+
explicitColumn match {
69+
case Some(columnRef) =>
70+
columnRef.referenceValueEx(columnIndex, row, schema)
71+
case None =>
72+
row.cells(columnIndex).value
73+
}
4474
}
4575

4676
def explicitName: Option[String] = explicitColumn.map("$" + _.ref + "/")
4777

78+
4879
def ruleName: String = explicitName.getOrElse("") + name
4980

5081
def columnIdentifierToIndex(schema: Schema, id: ColumnIdentifier): Int = {
@@ -57,9 +88,15 @@ abstract class Rule(name: String, val argProviders: ArgProvider*) extends Positi
5788
}
5889
}
5990

60-
def toValueError(row: Row, columnIndex:Int ) = s"""value: ${'"'}${row.cells(columnIndex).value}${'"'}"""
6191

62-
def toError = s"""$ruleName""" + (if (argProviders.isEmpty) "" else "(" + argProviders.foldLeft("")((a, b) => (if (a.isEmpty) "" else a + ", ") + b.toError) + ")")
92+
93+
def toValueError(row: Row, columnIndex:Int ) =
94+
s"""value: ${'"'}${row.cells(columnIndex).value}${'"'}"""
95+
96+
97+
def toError =
98+
s"""$ruleName""" + (if (argProviders.isEmpty) "" else "(" + argProviders.foldLeft("")((a, b) => (if (a.isEmpty) "" else a + ", ") + b.toError) + ")")
99+
63100
}
64101

65102
abstract class PatternRule(name: String, pattern: String) extends Rule(name) {

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/Schema.scala

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,8 @@ case class ColumnReference(ref: ColumnIdentifier) extends ArgProvider {
6363

6464
@throws[IndexOutOfBoundsException]
6565
def referenceValueEx(columnIndex: Int, row: Row, schema: Schema): String = {
66-
referenceValue(columnIndex, row, schema) match {
67-
case Some(rv) =>
68-
rv
69-
case None =>
70-
throw new ArrayIndexOutOfBoundsException(s"Could not access reference column $ref at [$columnIndex:${row.lineNumber}]")
66+
referenceValue(columnIndex, row, schema).getOrElse{
67+
throw new ArrayIndexOutOfBoundsException(s"Could not access reference column $ref at [$columnIndex:${row.lineNumber}]")
7168
}
7269
}
7370

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_0/Rule.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ case class IfRule(condition: Rule, rules: List[Rule], elseRules: Option[List[Rul
6262
override def evaluate(columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): RuleValidation[Any] = {
6363

6464
def conditionValid: Boolean = {
65-
val (cellValue,idx) = condition.explicitColumn match {
65+
val (cellValue,idx) = findColumnRefence(condition) match {
6666
case Some(columnRef) =>
6767
(columnRef.referenceValueEx(columnIndex, row, schema), columnIdentifierToIndex(schema, columnRef.ref))
6868
case None =>
@@ -180,7 +180,6 @@ case class NotEmptyRule() extends Rule("notEmpty") {
180180
}
181181
}
182182

183-
//case class UriRule() extends PatternRule("uri", UriRegex)
184183
case class UriRule() extends Rule("uri") {
185184
override def valid(cellValue: String, columnDefinition: ColumnDefinition, columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): Boolean = {
186185
try {

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_0/SchemaParser.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ trait SchemaParser extends BaseSchemaParser {
249249
positiveIntegerExpr ) ^^ {
250250
case explicitContext ~ rule =>
251251
rule.explicitColumn = explicitContext
252+
explicitContext.map(rule.explicitColumns += _)
252253
rule
253254
}
254255

@@ -457,6 +458,7 @@ trait SchemaParser extends BaseSchemaParser {
457458
lazy val externalSingleExpr: PackratParser[Rule] = "ExternalSingleExpr" ::= opt(explicitContextExpr) ~ (fileExistsExpr | checksumExpr | fileCountExpr) ^^ {
458459
case explicitContext ~ rule =>
459460
rule.explicitColumn = explicitContext
461+
explicitContext.map(rule.explicitColumns += _)
460462
rule
461463
}
462464

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_1/Rule.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ case class SwitchRule(elseRules: Option[List[Rule]], cases:(Rule, List[Rule])*)
3939

4040
override def evaluate(columnIndex: Int, row: Row, schema: Schema, mayBeLast: Option[Boolean] = None): RuleValidation[Any] = {
4141
def conditionValid(condition: Rule): Boolean = {
42-
val (cellValue,idx) = condition.explicitColumn match {
42+
val (cellValue,idx) = findColumnRefence(condition) match {
4343
case Some(columnRef) =>
4444
(columnRef.referenceValueEx(columnIndex, row, schema), columnIdentifierToIndex(schema, columnRef.ref))
4545
case None =>

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_1/SchemaParser.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ trait SchemaParser extends SchemaParser1_0 {
5454
lowerCaseExpr ) ^^ {
5555
case explicitContext ~ rule =>
5656
rule.explicitColumn = explicitContext
57+
explicitContext.map(rule.explicitColumns += _)
5758
rule
59+
5860
}
5961

6062
/**
@@ -70,6 +72,7 @@ trait SchemaParser extends SchemaParser1_0 {
7072
override lazy val externalSingleExpr: PackratParser[Rule] = "ExternalSingleExpr" ::= opt(explicitContextExpr) ~ (fileExistsExpr | integrityCheckExpr | checksumExpr | fileCountExpr) ^^ {
7173
case explicitContext ~ rule =>
7274
rule.explicitColumn = explicitContext
75+
explicitContext.map(rule.explicitColumns += _)
7376
rule
7477
}
7578

0 commit comments

Comments
 (0)