/* * Copyright 2014 Orient Technologies. * * 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.orientechnologies.lucene.operator; import com.orientechnologies.orient.core.command.OCommandContext; import com.orientechnologies.orient.core.metadata.schema.OClass; import com.orientechnologies.orient.core.sql.OIndexSearchResult; import com.orientechnologies.orient.core.sql.OSQLHelper; import com.orientechnologies.orient.core.sql.filter.OSQLFilterCondition; import com.orientechnologies.orient.core.sql.filter.OSQLFilterItemField; import com.orientechnologies.orient.core.sql.filter.OSQLFilterItemVariable; import com.orientechnologies.orient.core.sql.operator.OQueryOperatorBetween; import com.orientechnologies.orient.core.sql.operator.OQueryOperatorIn; import java.util.Collection; import java.util.List; public class OLuceneOperatorUtil { public static boolean checkIndexExistence(final OClass iSchemaClass, final OIndexSearchResult result) { if (!iSchemaClass.areIndexed(result.fields())) return false; if (result.lastField.isLong()) { final int fieldCount = result.lastField.getItemCount(); OClass cls = iSchemaClass.getProperty(result.lastField.getItemName(0)).getLinkedClass(); for (int i = 1; i < fieldCount; i++) { if (cls == null || !cls.areIndexed(result.lastField.getItemName(i))) { return false; } cls = cls.getProperty(result.lastField.getItemName(i)).getLinkedClass(); } } return true; } public static OIndexSearchResult createIndexedProperty(final OSQLFilterCondition iCondition, final Object iItem) { if (iItem == null || !(iItem instanceof OSQLFilterItemField)) return null; if (iCondition.getLeft() instanceof OSQLFilterItemField && iCondition.getRight() instanceof OSQLFilterItemField) return null; final OSQLFilterItemField item = (OSQLFilterItemField) iItem; if (item.hasChainOperators() && !item.isFieldChain()) return null; final Object origValue = iCondition.getLeft() == iItem ? iCondition.getRight() : iCondition.getLeft(); if (iCondition.getOperator() instanceof OQueryOperatorBetween || iCondition.getOperator() instanceof OQueryOperatorIn) { return new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), origValue); } final Object value = OSQLHelper.getValue(origValue); if (value == null) return null; return new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), value); } public static OIndexSearchResult buildOIndexSearchResult(OClass iSchemaClass, OSQLFilterCondition iCondition, List<OIndexSearchResult> iIndexSearchResults, OCommandContext context) { if (iCondition.getLeft() instanceof Collection) { OIndexSearchResult lastResult = null; Collection left = (Collection) iCondition.getLeft(); int i = 0; Object lastValue = null; for (Object obj : left) { if (obj instanceof OSQLFilterItemField) { OSQLFilterItemField item = (OSQLFilterItemField) obj; Object value = null; if (iCondition.getRight() instanceof Collection) { List<Object> right = (List<Object>) iCondition.getRight(); value = right.get(i); } else { value = iCondition.getRight(); } if (lastResult == null) { lastResult = new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), value); } else { lastResult = lastResult.merge(new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), value)); } } else if (obj instanceof OSQLFilterItemVariable) { OSQLFilterItemVariable item = (OSQLFilterItemVariable) obj; Object value = null; if (iCondition.getRight() instanceof Collection) { List<Object> right = (List<Object>) iCondition.getRight(); value = right.get(i); } else { value = iCondition.getRight(); } context.setVariable(item.toString(), value); } i++; } if (lastResult != null && OLuceneOperatorUtil.checkIndexExistence(iSchemaClass, lastResult)) iIndexSearchResults.add(lastResult); return lastResult; } else { OIndexSearchResult result = OLuceneOperatorUtil.createIndexedProperty(iCondition, iCondition.getLeft()); if (result == null) result = OLuceneOperatorUtil.createIndexedProperty(iCondition, iCondition.getRight()); if (result == null) return null; if (OLuceneOperatorUtil.checkIndexExistence(iSchemaClass, result)) iIndexSearchResults.add(result); return result; } } }