/* * Copyright (C) 2014 Indeed Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package com.indeed.imhotep.marshal; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.indeed.flamdex.query.BooleanOp; import com.indeed.flamdex.query.Query; import com.indeed.flamdex.query.Term; import com.indeed.imhotep.GroupMultiRemapRule; import com.indeed.imhotep.GroupRemapRule; import com.indeed.imhotep.QueryRemapRule; import com.indeed.imhotep.RegroupCondition; import com.indeed.imhotep.TermCount; import com.indeed.imhotep.protobuf.GroupMultiRemapMessage; import com.indeed.imhotep.protobuf.GroupRemapMessage; import com.indeed.imhotep.protobuf.Operator; import com.indeed.imhotep.protobuf.QueryMessage; import com.indeed.imhotep.protobuf.QueryRemapMessage; import com.indeed.imhotep.protobuf.RegroupConditionMessage; import com.indeed.imhotep.protobuf.TermCountMessage; import com.indeed.imhotep.protobuf.TermMessage; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @author jsgroth */ public final class ImhotepClientMarshaller { private static final Map<BooleanOp, Operator> operatorMap = ImmutableMap.<BooleanOp, Operator>builder() .put(BooleanOp.AND, Operator.AND) .put(BooleanOp.OR, Operator.OR) .put(BooleanOp.NOT, Operator.NOT) .build(); private ImhotepClientMarshaller() {} public static RegroupConditionMessage marshal(final RegroupCondition condition) { final RegroupConditionMessage.Builder builder = RegroupConditionMessage.newBuilder() .setField(condition.field) .setIntType(condition.intType) .setInequality(condition.inequality); if (condition.intType) { builder.setIntTerm(condition.intTerm); } else { builder.setStringTerm(condition.stringTerm); } return builder.build(); } public static List<GroupRemapMessage> marshal(final GroupRemapRule[] remapRules) { final List<GroupRemapMessage> ret = new ArrayList<GroupRemapMessage>(remapRules.length); for (final GroupRemapRule rule : remapRules) { ret.add(GroupRemapMessage.newBuilder() .setTargetGroup(rule.targetGroup) .setCondition(marshal(rule.condition)) .setNegativeGroup(rule.negativeGroup) .setPositiveGroup(rule.positiveGroup) .build()); } return ret; } public static TermMessage marshal(final Term term) { return TermMessage.newBuilder() .setFieldName(term.getFieldName()) .setIsIntField(term.isIntField()) .setTermIntVal(term.getTermIntVal()) .setTermStringVal(term.getTermStringVal()) .build(); } public static QueryMessage marshal(final Query query) { switch (query.getQueryType()) { case TERM: return QueryMessage.newBuilder().setMinTerm(marshal(query.getStartTerm())).build(); case BOOLEAN: final QueryMessage.Builder builder = QueryMessage.newBuilder() .setOperator(operatorMap.get(query.getOperator())); for (final Query operand : query.getOperands()) { builder.addOperand(marshal(operand)); } return builder.build(); case RANGE: return QueryMessage.newBuilder() .setMinTerm(marshal(query.getStartTerm())) .setMaxTerm(marshal(query.getEndTerm())) .setIsMaxInclusive(query.isMaxInclusive()) .build(); default: throw new IllegalArgumentException("unrecognized query type: " + query.getQueryType()); } } public static QueryRemapMessage marshal(final QueryRemapRule remapRule) { return QueryRemapMessage.newBuilder() .setTargetGroup(remapRule.getTargetGroup()) .setQuery(marshal(remapRule.getQuery())) .setNegativeGroup(remapRule.getNegativeGroup()) .setPositiveGroup(remapRule.getPositiveGroup()) .build(); } public static GroupMultiRemapMessage marshal(final GroupMultiRemapRule rule) { GroupMultiRemapMessage.Builder builder = GroupMultiRemapMessage.newBuilder(); builder.setNegativeGroup(rule.negativeGroup).setTargetGroup(rule.targetGroup); final int numConditions = rule.conditions.length; for (int conditionIx = 0; conditionIx < numConditions; conditionIx++) { builder.addCondition(marshal(rule.conditions[conditionIx])); builder.addPositiveGroup(rule.positiveGroups[conditionIx]); } return builder.build(); } public static List<GroupMultiRemapMessage> marshal(final GroupMultiRemapRule[] rawRules) { List<GroupMultiRemapMessage> result = Lists.newArrayListWithCapacity(rawRules.length); for (GroupMultiRemapRule rule : rawRules) { result.add(marshal(rule)); } return result; } public static List<TermCount> marshal(final List<TermCountMessage> rawTermCounts) { final List<TermCount> ret = Lists.newArrayListWithCapacity(rawTermCounts.size()); for (final TermCountMessage message : rawTermCounts) { ret.add(new TermCount(ImhotepDaemonMarshaller.marshal(message.getTerm()), message.getCount())); } return ret; } public static List<RegroupConditionMessage> marshal(RegroupCondition[] conditions) { final List<RegroupConditionMessage> ret = Lists.newArrayList(); for (final RegroupCondition condition : conditions) { ret.add(marshal(condition)); } return ret; } }