From d354e2825205bee7b73f3567455214cda8c2b394 Mon Sep 17 00:00:00 2001 From: tglman Date: Thu, 15 Jan 2015 17:12:34 +0000 Subject: [PATCH] refactored fix for mulivalue manual index. issue #2741 --- .../core/collate/ODefaultCollateFactory.java | 1 - .../core/collate/OMultivalueCollate.java | 41 ------- .../orient/core/index/OCompositeCollate.java | 90 +++++++++++++++ .../core/index/OCompositeIndexDefinition.java | 107 ++++-------------- .../core/index/OSimpleKeyIndexDefinition.java | 44 ++++++- .../sql/OCommandExecutorSQLCreateIndex.java | 36 +++--- 6 files changed, 168 insertions(+), 151 deletions(-) delete mode 100644 core/src/main/java/com/orientechnologies/orient/core/collate/OMultivalueCollate.java create mode 100644 core/src/main/java/com/orientechnologies/orient/core/index/OCompositeCollate.java diff --git a/core/src/main/java/com/orientechnologies/orient/core/collate/ODefaultCollateFactory.java b/core/src/main/java/com/orientechnologies/orient/core/collate/ODefaultCollateFactory.java index c23fd521350..8e73c29ff1a 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/collate/ODefaultCollateFactory.java +++ b/core/src/main/java/com/orientechnologies/orient/core/collate/ODefaultCollateFactory.java @@ -35,7 +35,6 @@ public class ODefaultCollateFactory implements OCollateFactory { static { register(new ODefaultCollate()); - register(new OMultivalueCollate()); register(new OCaseInsensitiveCollate()); } diff --git a/core/src/main/java/com/orientechnologies/orient/core/collate/OMultivalueCollate.java b/core/src/main/java/com/orientechnologies/orient/core/collate/OMultivalueCollate.java deleted file mode 100644 index d3740729ddb..00000000000 --- a/core/src/main/java/com/orientechnologies/orient/core/collate/OMultivalueCollate.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.orientechnologies.orient.core.collate; - -import java.util.List; - -import com.orientechnologies.common.comparator.ODefaultComparator; -import com.orientechnologies.orient.core.index.OCompositeKey; - -public class OMultivalueCollate extends ODefaultComparator implements OCollate { - - public static final String NAME = "multivalue"; - - public String getName() { - return NAME; - } - - public Object transform(final Object obj) { - if (obj instanceof List) - return new OCompositeKey((List) obj); - return obj; - } - - @Override - public int hashCode() { - return getName().hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (obj == null || obj.getClass() != this.getClass()) - return false; - - final ODefaultCollate that = (ODefaultCollate) obj; - - return getName().equals(that.getName()); - } - - @Override - public String toString() { - return "{" + getClass().getSimpleName() + " : name = " + getName() + "}"; - } -} diff --git a/core/src/main/java/com/orientechnologies/orient/core/index/OCompositeCollate.java b/core/src/main/java/com/orientechnologies/orient/core/index/OCompositeCollate.java new file mode 100644 index 00000000000..47df30a5b7d --- /dev/null +++ b/core/src/main/java/com/orientechnologies/orient/core/index/OCompositeCollate.java @@ -0,0 +1,90 @@ +package com.orientechnologies.orient.core.index; + +import java.util.ArrayList; +import java.util.List; + +import com.orientechnologies.orient.core.collate.OCollate; + +public class OCompositeCollate implements OCollate { + /** + * + */ + private final OAbstractIndexDefinition oCompositeIndexDefinition; + + /** + * @param oCompositeIndexDefinition + */ + public OCompositeCollate(OAbstractIndexDefinition oCompositeIndexDefinition) { + this.oCompositeIndexDefinition = oCompositeIndexDefinition; + } + + private final List collates = new ArrayList(); + + public void addCollate(OCollate collate) { + collates.add(collate); + } + + @Override + public String getName() { + throw new UnsupportedOperationException("getName"); + } + + @SuppressWarnings("unchecked") + @Override + public Object transform(Object obj) { + List keys = null; + if (obj instanceof OCompositeKey) { + final OCompositeKey compositeKey = (OCompositeKey) obj; + keys = compositeKey.getKeys(); + } else if (obj instanceof List) { + keys = (List) obj; + } else { + throw new OIndexException("Impossible add as key of a CompositeIndex a value of type " + obj.getClass()); + } + + OCompositeKey transformedKey = new OCompositeKey(); + + final int size = Math.min(keys.size(), collates.size()); + for (int i = 0; i < size; i++) { + final Object key = keys.get(i); + + final OCollate collate = collates.get(i); + transformedKey.addKey(collate.transform(key)); + } + + for (int i = size; i < keys.size(); i++) + transformedKey.addKey(keys.get(i)); + + return transformedKey; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + OCompositeCollate that = (OCompositeCollate) o; + + if (!collates.equals(that.collates)) + return false; + + return true; + } + + @Override + public int hashCode() { + return collates.hashCode(); + } + + public List getCollates() { + return collates; + } + + @Override + public String toString() { + return "OCompositeCollate{" + "collates=" + collates + ", null values ignored = " + + this.oCompositeIndexDefinition.isNullValuesIgnored() + '}'; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/orientechnologies/orient/core/index/OCompositeIndexDefinition.java b/core/src/main/java/com/orientechnologies/orient/core/index/OCompositeIndexDefinition.java index 66ca0cef010..994f987ad41 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/index/OCompositeIndexDefinition.java +++ b/core/src/main/java/com/orientechnologies/orient/core/index/OCompositeIndexDefinition.java @@ -1,22 +1,22 @@ /* - * - * * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com) - * * - * * 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. - * * - * * For more information: http://www.orientechnologies.com - * - */ + * + * * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com) + * * + * * 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. + * * + * * For more information: http://www.orientechnologies.com + * + */ package com.orientechnologies.orient.core.index; import java.lang.reflect.InvocationTargetException; @@ -44,7 +44,7 @@ public class OCompositeIndexDefinition extends OAbstractIndexDefinition { private final List indexDefinitions; private String className; private int multiValueDefinitionIndex = -1; - private OCompositeCollate collate = new OCompositeCollate(); + private OCompositeCollate collate = new OCompositeCollate(this); public OCompositeIndexDefinition() { indexDefinitions = new ArrayList(5); @@ -420,7 +420,7 @@ protected void fromStream() { indexDefinitions.clear(); - collate = new OCompositeCollate(); + collate = new OCompositeCollate(this); for (int i = 0; i < indClasses.size(); i++) { final Class clazz = Class.forName(indClasses.get(i)); @@ -545,71 +545,4 @@ private OCompositeKey convertToCompositeKey(Object key) { public boolean isAutomatic() { return indexDefinitions.get(0).isAutomatic(); } - - private final class OCompositeCollate implements OCollate { - private final List collates = new ArrayList(); - - public void addCollate(OCollate collate) { - collates.add(collate); - } - - @Override - public String getName() { - throw new UnsupportedOperationException("getName"); - } - - @SuppressWarnings("unchecked") - @Override - public Object transform(Object obj) { - List keys = null; - if (obj instanceof OCompositeKey) { - final OCompositeKey compositeKey = (OCompositeKey) obj; - keys = compositeKey.getKeys(); - } else if (obj instanceof List) { - keys = (List) obj; - } else { - throw new OIndexException("Impossible add as key of a CompositeIndex a value of type " + obj.getClass()); - } - - OCompositeKey transformedKey = new OCompositeKey(); - - final int size = Math.min(keys.size(), collates.size()); - for (int i = 0; i < size; i++) { - final Object key = keys.get(i); - - final OCollate collate = collates.get(i); - transformedKey.addKey(collate.transform(key)); - } - - for (int i = size; i < keys.size(); i++) - transformedKey.addKey(keys.get(i)); - - return transformedKey; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - OCompositeCollate that = (OCompositeCollate) o; - - if (!collates.equals(that.collates)) - return false; - - return true; - } - - @Override - public int hashCode() { - return collates.hashCode(); - } - - @Override - public String toString() { - return "OCompositeCollate{" + "collates=" + collates + ", null values ignored = " + isNullValuesIgnored() + '}'; - } - } } diff --git a/core/src/main/java/com/orientechnologies/orient/core/index/OSimpleKeyIndexDefinition.java b/core/src/main/java/com/orientechnologies/orient/core/index/OSimpleKeyIndexDefinition.java index df5fa107893..e9aa5b4e2d3 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/index/OSimpleKeyIndexDefinition.java +++ b/core/src/main/java/com/orientechnologies/orient/core/index/OSimpleKeyIndexDefinition.java @@ -25,7 +25,8 @@ import java.util.Collections; import java.util.List; -import com.orientechnologies.orient.core.collate.OMultivalueCollate; +import com.orientechnologies.orient.core.collate.OCollate; +import com.orientechnologies.orient.core.collate.ODefaultCollate; import com.orientechnologies.orient.core.db.record.ORecordElement; import com.orientechnologies.orient.core.metadata.schema.OType; import com.orientechnologies.orient.core.record.impl.ODocument; @@ -36,14 +37,29 @@ public class OSimpleKeyIndexDefinition extends OAbstractIndexDefinition { public OSimpleKeyIndexDefinition(final OType... keyTypes) { this.keyTypes = keyTypes; - if (keyTypes.length > 1) - collate = OSQLEngine.getCollate(OMultivalueCollate.NAME); - } public OSimpleKeyIndexDefinition() { } + public OSimpleKeyIndexDefinition(OType[] keyTypes2, List collatesList) { + this.keyTypes = keyTypes2; + if (keyTypes.length > 1) { + OCompositeCollate collate = new OCompositeCollate(this); + if (collatesList != null) { + for (OCollate oCollate : collatesList) { + collate.addCollate(oCollate); + } + } else { + for (OType type : keyTypes) { + collate.addCollate(OSQLEngine.getCollate(ODefaultCollate.NAME)); + } + } + this.collate = collate; + } + + } + public List getFields() { return Collections.emptyList(); } @@ -99,8 +115,15 @@ public ODocument toStream() { keyTypeNames.add(keyType.toString()); document.field("keyTypes", keyTypeNames, OType.EMBEDDEDLIST); - document.field("collate", collate.getName()); + if (collate instanceof OCompositeCollate) { + List collatesNames = new ArrayList(); + for (OCollate collate : ((OCompositeCollate) collate).getCollates()) + collatesNames.add(collate.getName()); + document.field("collates", collatesNames, OType.EMBEDDEDLIST); + } else + document.field("collate", collate.getName()); document.field("nullValuesIgnored", isNullValuesIgnored()); + return document; } finally { document.setInternalStatus(ORecordElement.STATUS.LOADED); @@ -117,8 +140,17 @@ protected void fromStream() { keyTypes[i] = OType.valueOf(keyTypeName); i++; } + String collate = document.field("collate"); + if (collate != null) { + setCollate(collate); + } else { + List collatesNames = document.field("collates"); + OCompositeCollate collates = new OCompositeCollate(this); + for (String collateName : collatesNames) + collates.addCollate(OSQLEngine.getCollate(collateName)); + this.collate = collates; + } - setCollate((String) document.field("collate")); setNullValuesIgnored(!Boolean.FALSE.equals(document. field("nullValuesIgnored"))); } diff --git a/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateIndex.java b/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateIndex.java index f5c08763ca4..e16b7754035 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateIndex.java +++ b/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateIndex.java @@ -216,10 +216,28 @@ public Object execute(final Map iArgs) { final ODatabaseDocument database = getDatabase(); final OIndex idx; + List collatesList = null; + + if (collates != null) { + collatesList = new ArrayList(); + + for (String collate : collates) { + if (collate != null) { + final OCollate col = OSQLEngine.getCollate(collate); + collatesList.add(col); + } else + collatesList.add(null); + } + } + if (fields == null || fields.length == 0) { + if (keyTypes != null) - idx = database.getMetadata().getIndexManager() - .createIndex(indexName, indexType.toString(), new OSimpleKeyIndexDefinition(keyTypes), null, null, metadataDoc, engine); + idx = database + .getMetadata() + .getIndexManager() + .createIndex(indexName, indexType.toString(), new OSimpleKeyIndexDefinition(keyTypes, collatesList), null, null, + metadataDoc, engine); else if (serializerKeyId != 0) { idx = database .getMetadata() @@ -234,20 +252,6 @@ else if (serializerKeyId != 0) { idx = oClass.createIndex(indexName, indexType.toString(), null, metadataDoc, engine, fields); } else { - List collatesList = null; - - if (collates != null) { - collatesList = new ArrayList(); - - for (String collate : collates) { - if (collate != null) { - final OCollate col = OSQLEngine.getCollate(collate); - collatesList.add(col); - } else - collatesList.add(null); - } - } - final OIndexDefinition idxDef = OIndexDefinitionFactory.createIndexDefinition(oClass, Arrays.asList(fields), Arrays.asList(keyTypes), collatesList);