2016-06-09 10 views
2

Können wir den compareOperator-Wert basierend auf dem Eingabewert verwenden? Zum Beispiel, wenn meine Eingabe ist eq, dann sollte es wählen CompareFilter.CompareOp.EQUAL, sonst wenn der Eingang ist ne sollte es CompareFilter.CompareOp.NOT_EQUAL wählen.hbase: Assign CompareFilter.CompareOp basierend auf dem Eingabewert

So etwas wie

if(input.equals("eq")) { 
    myCompareOp = EQUAL; 
}else if(input.equals("ne")) { 
    myCompareOp = NOT_EQUAL; 
} 

SingleColumnValueFilter colValFilter = new SingleColumnValueFilter(Bytes.toBytes(<CF>), Bytes.toBytes(<CQ>) 
       , myCompareOp, new BinaryComparator(Bytes.toBytes(<value>))); 

wird Irgendwelche Vorschläge

Antwort

1

Basierend auf obigen Code zu erkennen ist, wird Ja, es funktioniert. Unten ist das Beispiel-Code-Schnipsel, können Sie sich auch als well.where ConditionType Enum ist ... wie diese Sie auch Ihre eigenen Enum (nicht zwingend notwendig, wenn die Bedingung auch in Ordnung ist) vorbereiten können

private Filter buildSimpleQuery(ConditionType ct, String name, Object value) { 
    name = super.getRealPropertyName(name); 
    validatePropertyValue(name, value); 
    Class<?> clazz = getPrimitiveFieldClass(name, value.getClass()); 
    CompareOp compareOp = null; 
    boolean regexCompRequired = false; 
    switch (ct) { 
    case EQUALS: 
     compareOp = CompareOp.EQUAL; 
     regexCompRequired = String.class == clazz && value.toString().endsWith("*"); 
     break; 
    case NOT_EQUALS: 
     compareOp = CompareOp.NOT_EQUAL; 
     regexCompRequired = String.class == clazz && value.toString().endsWith("*"); 
     break; 
    case GREATER_THAN: 
     compareOp = CompareOp.GREATER; 
     break; 
    case GREATER_OR_EQUALS: 
     compareOp = CompareOp.GREATER_OR_EQUAL; 
     break; 
    case LESS_THAN: 
     compareOp = CompareOp.LESS; 
     break; 
    case LESS_OR_EQUALS: 
     compareOp = CompareOp.LESS_OR_EQUAL; 
     break; 
    default: 
     break; 
    } 
    String qualifier = name; 
    String theFamily = family != null ? family : familyMap.get(qualifier); 
    ByteArrayComparable byteArrayComparable = regexCompRequired 
     ? new RegexStringComparator(value.toString().replace("*", ".")) 
     : new BinaryComparator(value.toString().getBytes(StandardCharsets.UTF_8)); 

    Filter query = new SingleColumnValueFilter(theFamily.getBytes(StandardCharsets.UTF_8), 
               qualifier.getBytes(StandardCharsets.UTF_8), 
               compareOp, 
               byteArrayComparable); 
    return query; 
} 
+0

es funktioniert. Danke :) –

+0

Da es klappt und du in Ordnung bist, bitte flag-up als "vom Eigentümer angenommen" Danke –