Skip to content

Commit 968698f

Browse files
committed
update README and CHANGLEOG
1 parent 2229dab commit 968698f

6 files changed

Lines changed: 50 additions & 5 deletions

File tree

src/main/java/org/rcsb/cif/model/Category.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.rcsb.cif.model;
22

33
import java.util.Collections;
4+
import java.util.List;
45
import java.util.Map;
56
import java.util.function.Function;
67
import java.util.stream.Stream;
@@ -28,11 +29,24 @@ public interface Category {
2829
*/
2930
Column<?> getColumn(String name);
3031

32+
/**
33+
* Retrieve the names of all columns. The use-case of this method is to inquire about present columns in an
34+
* efficient way: be aware that access via {@link Category#getColumns()}
35+
* @return an ordered set containing all registered columns
36+
*/
37+
List<String> getColumnNames();
38+
3139
default <C extends Column<?>> C getColumn(String name, Function<Column<?>, C> wrapper) {
3240
Column<?> column = getColumn(name);
3341
return wrapper.apply(column != null ? column : new Column.EmptyColumn(name));
3442
}
3543

44+
/**
45+
* Access to all columns in this category. Invoking this method ensures that all binary columns are decoded. Call
46+
* this only if you are fine with this. Otherwise use {@link Category#getColumnNames()} to access registered columns
47+
* and {@link Category#getColumn(String)} to retrieve single columns efficiently.
48+
* @return a map of all columns (key: column_name, value: column).
49+
*/
3650
Map<String, Column<?>> getColumns();
3751

3852
/**
@@ -80,5 +94,10 @@ public Column<Void> getColumn(String name) {
8094
public Map<String, Column<?>> getColumns() {
8195
return Collections.emptyMap();
8296
}
97+
98+
@Override
99+
public List<String> getColumnNames() {
100+
return Collections.emptyList();
101+
}
83102
}
84103
}

src/main/java/org/rcsb/cif/model/binary/BinaryCategory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,9 @@ public Map<String, Column<?>> getColumns() {
8585
columnNames.forEach(this::getColumn);
8686
return decodedColumns;
8787
}
88+
89+
@Override
90+
public List<String> getColumnNames() {
91+
return columnNames;
92+
}
8893
}

src/main/java/org/rcsb/cif/model/text/TextCategory.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import org.rcsb.cif.model.Category;
44
import org.rcsb.cif.model.Column;
55

6+
import java.util.ArrayList;
7+
import java.util.List;
68
import java.util.Map;
79

810
public class TextCategory implements Category {
@@ -32,11 +34,18 @@ public int getRowCount() {
3234

3335
@Override
3436
public Column<?> getColumn(String name) {
35-
return textFields.computeIfAbsent(name, Column.EmptyColumn::new);
37+
// let's switch to getOrDefault to not introduce any meaningless columns when called for missing data
38+
return textFields.getOrDefault(name, new Column.EmptyColumn(name));
3639
}
3740

3841
@Override
3942
public Map<String, Column<?>> getColumns() {
4043
return textFields;
4144
}
45+
46+
@Override
47+
public List<String> getColumnNames() {
48+
// this could cause issues when users call getColumn and introduce empty columns
49+
return new ArrayList<>(textFields.keySet());
50+
}
4251
}

src/main/java/org/rcsb/cif/schema/CifCoreSchemaProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public void validate(CifFile cifFile) throws SchemaMismatchException {
2828
.getCategories()
2929
.values()
3030
.stream()
31-
.map(Category::getColumns)
32-
.allMatch(map -> map.size() == 1 && map.containsKey(""));
31+
.map(Category::getColumnNames)
32+
.allMatch(list -> list.size() == 1 && list.contains(""));
3333
if (!flatColumns) {
3434
throw new SchemaMismatchException("CIF_CORE schema should contain exclusively flat column names - format: category_name_column_name");
3535
}

src/main/java/org/rcsb/cif/schema/DelegatingCategory.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.rcsb.cif.schema.core.CifCoreBlock;
66

77
import java.util.LinkedHashMap;
8+
import java.util.List;
89
import java.util.Map;
910
import java.util.stream.Collectors;
1011

@@ -46,6 +47,11 @@ public Map<String, Column<?>> getColumns() {
4647
return columns;
4748
}
4849

50+
@Override
51+
public List<String> getColumnNames() {
52+
return delegate.getColumnNames();
53+
}
54+
4955
protected Column<?> createDelegate(String columnName, Column<?> column) {
5056
return new DelegatingColumn<>(column);
5157
}
@@ -87,6 +93,12 @@ public Map<String, Column<?>> getColumns() {
8793
.collect(Collectors.toMap(this::extractName, category -> category.getColumn("")));
8894
}
8995

96+
private final List<String> CIF_CORE_COLUMN_NAMES = List.of("");
97+
@Override
98+
public List<String> getColumnNames() {
99+
return CIF_CORE_COLUMN_NAMES;
100+
}
101+
90102
private String extractName(Category category) {
91103
return category.getCategoryName().replaceFirst(categoryName + "_", "");
92104
}

src/main/java/org/rcsb/cif/schema/MmCifSchemaProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public void validate(CifFile cifFile) throws SchemaMismatchException {
2828
.getCategories()
2929
.values()
3030
.stream()
31-
.map(Category::getColumns)
32-
.anyMatch(map -> map.size() == 1 && map.containsKey(""));
31+
.map(Category::getColumnNames)
32+
.anyMatch(list -> list.size() == 1 && list.contains(""));
3333
if (flatColumns) {
3434
throw new SchemaMismatchException("MMCIF schema should not contain flat column names - format: category_name.column_name");
3535
}

0 commit comments

Comments
 (0)