package ch.elexis.core.model;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import ch.elexis.core.types.LabItemTyp;
public class LabResultConstants {
public static final int PATHOLOGIC = 1 << 0;
/**
* Anwender erklärt den Parameter für beobachtungswürdig
*/
public static final int OBSERVE = 1 << 1;
/**
* Anwender erklärt den Wert explizit für normal (auch wenn er formal ausserhalb des
* Normbereichs ist)
*/
public static final int NORMAL = 1 << 2;
public static final String SMALLER = "<";
public static final String BIGGER = ">";
public static Pattern refValuesPattern = Pattern.compile("\\((.*?)\\)"); //$NON-NLS-1$
public static String[] VALID_ABS_VALUES = new String[] {
"positiv", "negativ", "pos.", "neg.", "pos", "neg", ">0", "<0"
};
/**
* Determine whether the provided LabItem and its result are pathologic
*
* @param item
* @param result
* @param referenceValues
* @return
*/
public static boolean isPathologic(final ILabItem item, final String result,
final String referenceValues){
if (item.getTyp().equals(LabItemTyp.ABSOLUTE)) {
if (result.toLowerCase().startsWith("pos")) { //$NON-NLS-1$
return true;
}
if (result.trim().startsWith("+")) { //$NON-NLS-1$
return true;
}
} else /* if(item.getTyp().equals(LabItem.typ.NUMERIC)) */ {
List<String> refStrings = LabResultConstants.parseRefString(referenceValues);
// only test first string as range is defined in one string
if (!refStrings.isEmpty() && result != null) {
return LabResultConstants.testRef(refStrings.get(0), result);
}
}
return false;
}
public static List<String> parseRefString(String ref){
List<String> result = new ArrayList<String>();
Matcher m = refValuesPattern.matcher(ref);
while (m.find()) {
result.add(m.group(1).trim());
}
// add the whole string if nothing found
if (result.isEmpty()) {
result.add(ref.trim());
}
return result;
}
public static boolean testRef(String ref, String result){
try {
if (ref.trim().startsWith(SMALLER) || ref.trim().startsWith(BIGGER)) {
String resultSign = null;
double refVal = Double.parseDouble(ref.substring(1).trim());
if (result.trim().startsWith(SMALLER) || result.trim().startsWith(BIGGER)) {
resultSign = result.substring(0, 1).trim();
result = result.substring(1).trim();
}
double val = Double.parseDouble(result);
if (ref.trim().startsWith(SMALLER)) {
if (val >= refVal && !(val == refVal && SMALLER.equals(resultSign))) {
return true;
}
} else {
if (val <= refVal && !(val == refVal && BIGGER.equals(resultSign))) {
return true;
}
}
} else {
String[] range = ref.split("\\s*-\\s*"); //$NON-NLS-1$
if (range.length == 2) {
double lower = Double.parseDouble(range[0]);
double upper = Double.parseDouble(range[1]);
double val = Double.parseDouble(result);
if ((val < lower) || (val > upper)) {
return true;
}
}
}
} catch (NumberFormatException nfe) {
// don't mind
}
return false;
}
}