protected Iterator<? extends OIdentifiable> searchInClasses( final OClass iCls, final boolean iPolymorphic, final boolean iAscendentOrder) { final ODatabaseDocumentInternal database = getDatabase(); database.checkSecurity( ORule.ResourceGeneric.CLASS, ORole.PERMISSION_READ, iCls.getName().toLowerCase()); final ORID[] range = getRange(); if (iAscendentOrder) return new ORecordIteratorClass<ORecord>( database, database, iCls.getName(), iPolymorphic, isUseCache(), false) .setRange(range[0], range[1]); else return new ORecordIteratorClassDescendentOrder<ORecord>( database, database, iCls.getName(), iPolymorphic) .setRange(range[0], range[1]); }
protected void searchInClusters() { final ODatabaseDocumentInternal database = getDatabase(); final Set<Integer> clusterIds = new HashSet<Integer>(); for (String clusterName : parsedTarget.getTargetClusters().keySet()) { if (clusterName == null || clusterName.length() == 0) throw new OCommandExecutionException("No cluster or schema class selected in query"); database.checkSecurity( ORule.ResourceGeneric.CLUSTER, ORole.PERMISSION_READ, clusterName.toLowerCase()); if (Character.isDigit(clusterName.charAt(0))) { // GET THE CLUSTER NUMBER for (int clusterId : OStringSerializerHelper.splitIntArray(clusterName)) { if (clusterId == -1) throw new OCommandExecutionException("Cluster '" + clusterName + "' not found"); clusterIds.add(clusterId); } } else { // GET THE CLUSTER NUMBER BY THE CLASS NAME final int clusterId = database.getClusterIdByName(clusterName.toLowerCase()); if (clusterId == -1) throw new OCommandExecutionException("Cluster '" + clusterName + "' not found"); clusterIds.add(clusterId); } } // CREATE CLUSTER AS ARRAY OF INT final int[] clIds = new int[clusterIds.size()]; int i = 0; for (int c : clusterIds) clIds[i++] = c; final ORID[] range = getRange(); target = new ORecordIteratorClusters<ORecord>(database, database, clIds) .setRange(range[0], range[1]); }
private OClass createClassInternal( final String className, final int[] clusterIdsToAdd, final List<OClass> superClasses) throws ClusterIdsAreEmptyException { acquireSchemaWriteLock(); try { if (className == null || className.length() == 0) throw new OSchemaException("Found class name null or empty"); if (Character.isDigit(className.charAt(0))) throw new OSchemaException("Found invalid class name. Cannot start with numbers"); final Character wrongCharacter = checkClassNameIfValid(className); if (wrongCharacter != null) throw new OSchemaException( "Found invalid class name. Character '" + wrongCharacter + "' cannot be used in class name."); final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); checkEmbedded(storage); checkClustersAreAbsent(clusterIdsToAdd); final int[] clusterIds; if (clusterIdsToAdd == null || clusterIdsToAdd.length == 0) { throw new ClusterIdsAreEmptyException(); } else clusterIds = clusterIdsToAdd; database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); final String key = className.toLowerCase(); if (classes.containsKey(key)) throw new OSchemaException("Class " + className + " already exists in current database"); OClassImpl cls = new OClassImpl(this, className, clusterIds); classes.put(key, cls); if (superClasses != null && superClasses.size() > 0) { cls.setSuperClassesInternal(superClasses); for (OClass superClass : superClasses) { // UPDATE INDEXES final int[] clustersToIndex = superClass.getPolymorphicClusterIds(); final String[] clusterNames = new String[clustersToIndex.length]; for (int i = 0; i < clustersToIndex.length; i++) clusterNames[i] = database.getClusterNameById(clustersToIndex[i]); for (OIndex<?> index : superClass.getIndexes()) for (String clusterName : clusterNames) if (clusterName != null) database .getMetadata() .getIndexManager() .addClusterToIndex(clusterName, index.getName()); } } addClusterClassMap(cls); return cls; } finally { releaseSchemaWriteLock(); } }