class AsyncPackageDataModelOracleImpl implements AsyncPackageDataModelOracle {

    @Override
    public void getConnectiveOperatorCompletions(final String factType,
                                                 final String fieldName,
                                                 final Callback<String[]> callback) {
        final String fieldType = getFieldType(factType,
                                              fieldName);

        if (fieldType == null) {
            callback.callback(OperatorsOracle.STANDARD_CONNECTIVES);
            return;
        } else if (fieldName.equals(DataType.TYPE_THIS)) {
            isFactTypeAnEvent(factType,
                              new Callback<Boolean>() {
                                  @Override
                                  public void callback(final Boolean isFactTypeAnEvent) {
                                      if (Boolean.TRUE.equals(isFactTypeAnEvent)) {
                                          callback.callback(OracleUtils.joinArrays(OperatorsOracle.STANDARD_CONNECTIVES,
                                                                                   OperatorsOracle.SIMPLE_CEP_CONNECTIVES,
                                                                                   OperatorsOracle.COMPLEX_CEP_CONNECTIVES));
                                          return;
                                      } else {
                                          callback.callback(OperatorsOracle.STANDARD_CONNECTIVES);
                                          return;
                                      }
                                  }
                              });
        } else if (fieldType.equals(DataType.TYPE_STRING)) {
            callback.callback(OperatorsOracle.STRING_CONNECTIVES);
            return;
        } else if (DataType.isNumeric(fieldType)) {
            callback.callback(OperatorsOracle.COMPARABLE_CONNECTIVES);
            return;
        } else if (DataType.isDate(fieldType)) {
            callback.callback(OracleUtils.joinArrays(OperatorsOracle.COMPARABLE_CONNECTIVES,
                                                     OperatorsOracle.SIMPLE_CEP_CONNECTIVES));
            return;
        } else if (fieldType.equals(DataType.TYPE_COMPARABLE)) {
            callback.callback(OperatorsOracle.COMPARABLE_CONNECTIVES);
            return;
        } else if (fieldType.equals(DataType.TYPE_COLLECTION)) {
            callback.callback(OperatorsOracle.COLLECTION_CONNECTIVES);
            return;
        } else {
            callback.callback(OperatorsOracle.STANDARD_CONNECTIVES);
        }
    }

    @Inject public  AsyncPackageDataModelOracleImpl(final Caller<IncrementalDataModelService> service,
                                           final Instance<DynamicValidator> validatorInstance);

}