You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by to...@apache.org on 2015/04/13 21:18:28 UTC
[21/33] incubator-usergrid git commit: Removed unused 1.0 files.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/f95d39c7/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityValueSerializer.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityValueSerializer.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityValueSerializer.java
deleted file mode 100644
index d0e18d4..0000000
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityValueSerializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.usergrid.persistence.cassandra;
-
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-import me.prettyprint.cassandra.serializers.AbstractSerializer;
-import me.prettyprint.hector.api.beans.DynamicComposite;
-
-import static org.apache.usergrid.utils.ConversionUtils.bytebuffer;
-
-
-public class EntityValueSerializer extends AbstractSerializer<Object> {
-
- @Override
- public ByteBuffer toByteBuffer( Object obj ) {
- ByteBuffer bytes = null;
- if ( obj instanceof List ) {
- bytes = DynamicComposite.toByteBuffer( ( List<?> ) obj );
- }
- else if ( obj instanceof Object[] ) {
- bytes = DynamicComposite.toByteBuffer( ( Object[] ) obj );
- }
- else {
- bytes = bytebuffer( obj );
- }
- return bytes;
- }
-
-
- @Override
- public Object fromByteBuffer( ByteBuffer byteBuffer ) {
- throw new IllegalStateException(
- "The entity value serializer can only be used for data going to the database, " +
- "and not data coming from the database" );
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/f95d39c7/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/GeoIndexManager.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/GeoIndexManager.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/GeoIndexManager.java
deleted file mode 100644
index 4d696ae..0000000
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/GeoIndexManager.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.usergrid.persistence.cassandra;
-
-
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.UUID;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.usergrid.persistence.EntityRef;
-import org.apache.usergrid.persistence.IndexBucketLocator;
-import org.apache.usergrid.persistence.IndexBucketLocator.IndexType;
-import org.apache.usergrid.persistence.geo.EntityLocationRef;
-import org.apache.usergrid.persistence.geo.GeocellManager;
-import org.apache.usergrid.persistence.geo.model.Point;
-import org.apache.usergrid.persistence.hector.CountingMutator;
-
-import me.prettyprint.cassandra.serializers.ByteBufferSerializer;
-import me.prettyprint.hector.api.Keyspace;
-import me.prettyprint.hector.api.beans.DynamicComposite;
-import me.prettyprint.hector.api.beans.HColumn;
-import me.prettyprint.hector.api.mutation.Mutator;
-
-import static me.prettyprint.hector.api.factory.HFactory.createColumn;
-import static me.prettyprint.hector.api.factory.HFactory.createMutator;
-import org.apache.usergrid.persistence.EntityManager;
-import static org.apache.usergrid.persistence.Schema.DICTIONARY_GEOCELL;
-import static org.apache.usergrid.persistence.Schema.INDEX_CONNECTIONS;
-import static org.apache.usergrid.persistence.cassandra.ApplicationCF.ENTITY_INDEX;
-import static org.apache.usergrid.persistence.cassandra.CassandraPersistenceUtils.addInsertToMutator;
-import static org.apache.usergrid.persistence.cassandra.CassandraPersistenceUtils.batchExecute;
-import static org.apache.usergrid.persistence.cassandra.CassandraPersistenceUtils.key;
-import static org.apache.usergrid.persistence.cassandra.CassandraPersistenceUtils.logBatchOperation;
-import static org.apache.usergrid.utils.ConversionUtils.bytebuffer;
-
-
-public class GeoIndexManager {
-
- private static final Logger logger = LoggerFactory.getLogger( GeoIndexManager.class );
-
- /**
- * We only ever go down to max resolution of 9 because we use bucket hashing. Every level divides the region by
- * 1/16. Our original "box" is 90 degrees by 45 degrees. We therefore have 90 * (1/16)^(r-1) and 45 * (1/16)^(r-1)
- * for our size where r is the largest bucket resolution. This gives us a size of 90 deg => 0.0000000209547 deg =
- * .2cm and 45 deg => 0.00000001047735 deg = .1 cm
- */
- public static final int MAX_RESOLUTION = 9;
-
-
- EntityManager em;
- CassandraService cass;
-
-
- public GeoIndexManager() {
- }
-
-
- public GeoIndexManager init( EntityManager em ) {
- this.em = em;
- this.cass = em.getCass();
- return this;
- }
-
-
- public static Mutator<ByteBuffer> addLocationEntryInsertionToMutator( Mutator<ByteBuffer> m, Object key,
- EntityLocationRef entry ) {
-
- DynamicComposite columnName = entry.getColumnName();
- DynamicComposite columnValue = entry.getColumnValue();
- long ts = entry.getTimestampInMicros();
-
- logBatchOperation( "Insert", ENTITY_INDEX, key, columnName, columnValue, ts );
-
- HColumn<ByteBuffer, ByteBuffer> column =
- createColumn( columnName.serialize(), columnValue.serialize(), ts, ByteBufferSerializer.get(),
- ByteBufferSerializer.get() );
- m.addInsertion( bytebuffer( key ), ENTITY_INDEX.toString(), column );
-
- return m;
- }
-
-
- private static Mutator<ByteBuffer> batchAddConnectionIndexEntries( Mutator<ByteBuffer> m,
- IndexBucketLocator locator, UUID appId,
- String propertyName, String geoCell,
- UUID[] index_keys, ByteBuffer columnName,
- ByteBuffer columnValue, long timestamp ) {
-
- // entity_id,prop_name
- Object property_index_key =
- key( index_keys[ConnectionRefImpl.ALL], INDEX_CONNECTIONS, propertyName, DICTIONARY_GEOCELL, geoCell,
- locator.getBucket( appId, IndexType.CONNECTION, index_keys[ConnectionRefImpl.ALL], geoCell ) );
-
- // entity_id,entity_type,prop_name
- Object entity_type_prop_index_key =
- key( index_keys[ConnectionRefImpl.BY_ENTITY_TYPE], INDEX_CONNECTIONS, propertyName, DICTIONARY_GEOCELL,
- geoCell,
- locator.getBucket( appId, IndexType.CONNECTION, index_keys[ConnectionRefImpl.BY_ENTITY_TYPE],
- geoCell ) );
-
- // entity_id,connection_type,prop_name
- Object connection_type_prop_index_key =
- key( index_keys[ConnectionRefImpl.BY_CONNECTION_TYPE], INDEX_CONNECTIONS, propertyName,
- DICTIONARY_GEOCELL, geoCell, locator.getBucket( appId, IndexType.CONNECTION,
- index_keys[ConnectionRefImpl.BY_CONNECTION_TYPE], geoCell ) );
-
- // entity_id,connection_type,entity_type,prop_name
- Object connection_type_and_entity_type_prop_index_key =
- key( index_keys[ConnectionRefImpl.BY_CONNECTION_AND_ENTITY_TYPE], INDEX_CONNECTIONS, propertyName,
- DICTIONARY_GEOCELL, geoCell, locator.getBucket( appId, IndexType.CONNECTION,
- index_keys[ConnectionRefImpl.BY_CONNECTION_AND_ENTITY_TYPE], geoCell ) );
-
- // composite(property_value,connected_entity_id,connection_type,entity_type,entry_timestamp)
- addInsertToMutator( m, ENTITY_INDEX, property_index_key, columnName, columnValue, timestamp );
-
- // composite(property_value,connected_entity_id,connection_type,entry_timestamp)
- addInsertToMutator( m, ENTITY_INDEX, entity_type_prop_index_key, columnName, columnValue, timestamp );
-
- // composite(property_value,connected_entity_id,entity_type,entry_timestamp)
- addInsertToMutator( m, ENTITY_INDEX, connection_type_prop_index_key, columnName, columnValue, timestamp );
-
- // composite(property_value,connected_entity_id,entry_timestamp)
- addInsertToMutator( m, ENTITY_INDEX, connection_type_and_entity_type_prop_index_key, columnName, columnValue,
- timestamp );
-
- return m;
- }
-
-
- public static void batchStoreLocationInConnectionsIndex( Mutator<ByteBuffer> m, IndexBucketLocator locator,
- UUID appId, UUID[] index_keys, String propertyName,
- EntityLocationRef location ) {
-
- logger.debug("batchStoreLocationInConnectionsIndex");
-
- Point p = location.getPoint();
- List<String> cells = GeocellManager.generateGeoCell( p );
-
- ByteBuffer columnName = location.getColumnName().serialize();
- ByteBuffer columnValue = location.getColumnValue().serialize();
- long ts = location.getTimestampInMicros();
- for ( String cell : cells ) {
- batchAddConnectionIndexEntries( m, locator, appId, propertyName, cell, index_keys, columnName, columnValue,
- ts );
- }
-
- logger.info( "Geocells to be saved for Point({} , {} ) are: {}", new Object[] {
- location.getLatitude(), location.getLongitude(), cells
- } );
- }
-
-
- private static Mutator<ByteBuffer> addLocationEntryDeletionToMutator( Mutator<ByteBuffer> m, Object key,
- EntityLocationRef entry ) {
-
- DynamicComposite columnName = entry.getColumnName();
- long ts = entry.getTimestampInMicros();
-
- logBatchOperation( "Delete", ENTITY_INDEX, key, columnName, null, ts );
-
- m.addDeletion( bytebuffer( key ), ENTITY_INDEX.toString(), columnName.serialize(), ByteBufferSerializer.get(),
- ts + 1 );
-
- return m;
- }
-
-
- private static Mutator<ByteBuffer> batchDeleteConnectionIndexEntries( Mutator<ByteBuffer> m,
- IndexBucketLocator locator, UUID appId,
- String propertyName, String geoCell,
- UUID[] index_keys, ByteBuffer columnName,
- long timestamp ) {
-
- // entity_id,prop_name
- Object property_index_key =
- key( index_keys[ConnectionRefImpl.ALL], INDEX_CONNECTIONS, propertyName, DICTIONARY_GEOCELL, geoCell,
- locator.getBucket( appId, IndexType.CONNECTION, index_keys[ConnectionRefImpl.ALL], geoCell ) );
-
- // entity_id,entity_type,prop_name
- Object entity_type_prop_index_key =
- key( index_keys[ConnectionRefImpl.BY_ENTITY_TYPE], INDEX_CONNECTIONS, propertyName, DICTIONARY_GEOCELL,
- geoCell,
- locator.getBucket( appId, IndexType.CONNECTION, index_keys[ConnectionRefImpl.BY_ENTITY_TYPE],
- geoCell ) );
-
- // entity_id,connection_type,prop_name
- Object connection_type_prop_index_key =
- key( index_keys[ConnectionRefImpl.BY_CONNECTION_TYPE], INDEX_CONNECTIONS, propertyName,
- DICTIONARY_GEOCELL, geoCell, locator.getBucket( appId, IndexType.CONNECTION,
- index_keys[ConnectionRefImpl.BY_CONNECTION_TYPE], geoCell ) );
-
- // entity_id,connection_type,entity_type,prop_name
- Object connection_type_and_entity_type_prop_index_key =
- key( index_keys[ConnectionRefImpl.BY_CONNECTION_AND_ENTITY_TYPE], INDEX_CONNECTIONS, propertyName,
- DICTIONARY_GEOCELL, geoCell, locator.getBucket( appId, IndexType.CONNECTION,
- index_keys[ConnectionRefImpl.BY_CONNECTION_AND_ENTITY_TYPE], geoCell ) );
-
- // composite(property_value,connected_entity_id,connection_type,entity_type,entry_timestamp)
- m.addDeletion( bytebuffer( property_index_key ), ENTITY_INDEX.toString(), columnName,
- ByteBufferSerializer.get(), timestamp );
-
- // composite(property_value,connected_entity_id,connection_type,entry_timestamp)
- m.addDeletion( bytebuffer( entity_type_prop_index_key ), ENTITY_INDEX.toString(), columnName,
- ByteBufferSerializer.get(), timestamp );
-
- // composite(property_value,connected_entity_id,entity_type,entry_timestamp)
- m.addDeletion( bytebuffer( connection_type_prop_index_key ), ENTITY_INDEX.toString(), columnName,
- ByteBufferSerializer.get(), timestamp );
-
- // composite(property_value,connected_entity_id,entry_timestamp)
- m.addDeletion( bytebuffer( connection_type_and_entity_type_prop_index_key ), ENTITY_INDEX.toString(),
- columnName, ByteBufferSerializer.get(), timestamp );
-
- return m;
- }
-
-
- public static void batchDeleteLocationInConnectionsIndex( Mutator<ByteBuffer> m, IndexBucketLocator locator,
- UUID appId, UUID[] index_keys, String propertyName,
- EntityLocationRef location ) {
-
- logger.debug("batchDeleteLocationInConnectionsIndex");
-
- Point p = location.getPoint();
- List<String> cells = GeocellManager.generateGeoCell( p );
-
- ByteBuffer columnName = location.getColumnName().serialize();
-
- long ts = location.getTimestampInMicros();
-
- for ( String cell : cells ) {
-
- batchDeleteConnectionIndexEntries( m, locator, appId, propertyName, cell, index_keys, columnName, ts );
- }
-
- logger.info( "Geocells to be saved for Point({} , {} ) are: {}", new Object[] {
- location.getLatitude(), location.getLongitude(), cells
- } );
- }
-
-
- public static void batchStoreLocationInCollectionIndex( Mutator<ByteBuffer> m, IndexBucketLocator locator,
- UUID appId, Object key, UUID entityId,
- EntityLocationRef location ) {
-
- Point p = location.getPoint();
- List<String> cells = GeocellManager.generateGeoCell( p );
-
- for ( int i = 0; i < MAX_RESOLUTION; i++ ) {
- String cell = cells.get( i );
-
- String indexBucket = locator.getBucket( appId, IndexType.GEO, entityId, cell );
-
- addLocationEntryInsertionToMutator( m, key( key, DICTIONARY_GEOCELL, cell, indexBucket ), location );
- }
-
- if ( logger.isInfoEnabled() ) {
- logger.info( "Geocells to be saved for Point({},{}) are: {}", new Object[] {
- location.getLatitude(), location.getLongitude(), cells
- } );
- }
- }
-
-
- public void storeLocationInCollectionIndex( EntityRef owner, String collectionName, UUID entityId,
- String propertyName, EntityLocationRef location ) {
-
- Keyspace ko = cass.getApplicationKeyspace( em.getApplicationId() );
- Mutator<ByteBuffer> m = CountingMutator.createFlushingMutator( ko, ByteBufferSerializer.get() );
-
- batchStoreLocationInCollectionIndex( m, em.getIndexBucketLocator(), em.getApplicationId(),
- key( owner.getUuid(), collectionName, propertyName ), owner.getUuid(), location );
-
- batchExecute( m, CassandraService.RETRY_COUNT );
- }
-
-
- public static void batchRemoveLocationFromCollectionIndex( Mutator<ByteBuffer> m, IndexBucketLocator locator,
- UUID appId, Object key, EntityLocationRef location ) {
-
- Point p = location.getPoint();
- List<String> cells = GeocellManager.generateGeoCell( p );
-
- // delete for every bucket in every resolution
- for ( int i = 0; i < MAX_RESOLUTION; i++ ) {
-
- String cell = cells.get( i );
-
- for ( String indexBucket : locator.getBuckets( appId, IndexType.GEO, cell ) ) {
-
- addLocationEntryDeletionToMutator( m, key( key, DICTIONARY_GEOCELL, cell, indexBucket ), location );
- }
- }
-
- if ( logger.isInfoEnabled() ) {
- logger.info( "Geocells to be deleted for Point({},{}) are: {}", new Object[] {
- location.getLatitude(), location.getLongitude(), cells
- } );
- }
- }
-
-
- public void removeLocationFromCollectionIndex( EntityRef owner, String collectionName, String propertyName,
- EntityLocationRef location ) {
-
- Keyspace ko = cass.getApplicationKeyspace( em.getApplicationId() );
- Mutator<ByteBuffer> m = CountingMutator.createFlushingMutator( ko, ByteBufferSerializer.get() );
-
- batchRemoveLocationFromCollectionIndex( m, em.getIndexBucketLocator(), em.getApplicationId(),
- key( owner.getUuid(), collectionName, propertyName ), location );
-
- batchExecute( m, CassandraService.RETRY_COUNT );
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/f95d39c7/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/IndexUpdate.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/IndexUpdate.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/IndexUpdate.java
deleted file mode 100644
index 2634b5d..0000000
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/IndexUpdate.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.usergrid.persistence.cassandra;
-
-
-import java.io.IOException;
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.usergrid.persistence.Entity;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.uuid.UUIDComparator;
-
-import me.prettyprint.hector.api.beans.DynamicComposite;
-import me.prettyprint.hector.api.mutation.Mutator;
-
-import static java.nio.ByteBuffer.wrap;
-import static java.util.Arrays.asList;
-
-import static org.apache.usergrid.utils.JsonUtils.toJsonNode;
-import static org.apache.usergrid.utils.UUIDUtils.getTimestampInMicros;
-
-
-public class IndexUpdate {
-
- private static final Logger logger = LoggerFactory.getLogger( IndexUpdate.class );
-
- public static final byte VALUE_CODE_BYTES = 0;
- public static final byte VALUE_CODE_UTF8 = 1;
- public static final byte VALUE_CODE_UUID = 2;
- public static final byte VALUE_CODE_INT = 3;
- public static final byte VALUE_CODE_MAX = 127;
-
- public static int INDEX_STRING_VALUE_LENGTH = 1024;
-
- private Mutator<ByteBuffer> batch;
- private Entity entity;
- private String entryName;
- private Object entryValue;
- private final List<IndexEntry> prevEntries = new ArrayList<IndexEntry>();
- private final List<IndexEntry> newEntries = new ArrayList<IndexEntry>();
- private final Set<String> indexesSet = new LinkedHashSet<String>();
- private boolean schemaHasProperty;
- private boolean isMultiValue;
- private boolean removeListEntry;
- private long timestamp;
- private final UUID timestampUuid;
- private UUID associatedId;
-
-
- public IndexUpdate( Mutator<ByteBuffer> batch, Entity entity, String entryName, Object entryValue,
- boolean schemaHasProperty, boolean isMultiValue, boolean removeListEntry, UUID timestampUuid ) {
- this.batch = batch;
- this.entity = entity;
- this.entryName = entryName;
- this.entryValue = entryValue;
- this.schemaHasProperty = schemaHasProperty;
- this.isMultiValue = isMultiValue;
- this.removeListEntry = removeListEntry;
- timestamp = getTimestampInMicros( timestampUuid );
- this.timestampUuid = timestampUuid;
- }
-
-
- public Mutator<ByteBuffer> getBatch() {
- return batch;
- }
-
-
- public void setBatch( Mutator<ByteBuffer> batch ) {
- this.batch = batch;
- }
-
-
- public Entity getEntity() {
- return entity;
- }
-
-
- public void setEntity( Entity entity ) {
- this.entity = entity;
- }
-
-
- public UUID getId() {
- if ( associatedId != null ) {
- return associatedId;
- }
- return entity.getUuid();
- }
-
-
- public String getEntryName() {
- return entryName;
- }
-
-
- public void setEntryName( String entryName ) {
- this.entryName = entryName;
- }
-
-
- public Object getEntryValue() {
- return entryValue;
- }
-
-
- public void setEntryValue( Object entryValue ) {
- this.entryValue = entryValue;
- }
-
-
- public long getTimestamp() {
- return timestamp;
- }
-
-
- public void setTimestamp( long timestamp ) {
- this.timestamp = timestamp;
- }
-
-
- public UUID getTimestampUuid() {
- return timestampUuid;
- }
-
-
- public List<IndexEntry> getPrevEntries() {
- return prevEntries;
- }
-
-
- public void addPrevEntry( String path, Object value, UUID timestamp, ByteBuffer ledgerValue ) {
- IndexEntry entry = new IndexEntry( path, value, timestamp, ledgerValue );
- prevEntries.add( entry );
- }
-
-
- public List<IndexEntry> getNewEntries() {
- return newEntries;
- }
-
-
- public void addNewEntry( String path, Object value ) {
- IndexEntry entry = new IndexEntry( path, value, timestampUuid, null );
- newEntries.add( entry );
- }
-
-
- public Set<String> getIndexesSet() {
- return indexesSet;
- }
-
-
- public void addIndex( String index ) {
- logger.debug( "Indexing {}", index );
- indexesSet.add( index );
- }
-
-
- public boolean isSchemaHasProperty() {
- return schemaHasProperty;
- }
-
-
- public void setSchemaHasProperty( boolean schemaHasProperty ) {
- this.schemaHasProperty = schemaHasProperty;
- }
-
-
- public boolean isMultiValue() {
- return isMultiValue;
- }
-
-
- public void setMultiValue( boolean isMultiValue ) {
- this.isMultiValue = isMultiValue;
- }
-
-
- public boolean isRemoveListEntry() {
- return removeListEntry;
- }
-
-
- public void setRemoveListEntry( boolean removeListEntry ) {
- this.removeListEntry = removeListEntry;
- }
-
-
- public void setAssociatedId( UUID associatedId ) {
- this.associatedId = associatedId;
- }
-
-
- public UUID getAssociatedId() {
- return associatedId;
- }
-
-
- public class IndexEntry {
- private final byte code;
- private String path;
- private final Object value;
- private final UUID timestampUuid;
- private final ByteBuffer ledgerColumn;
-
-
- public IndexEntry( String path, Object value, UUID timestampUuid, ByteBuffer ledgerColumn ) {
- this.path = path;
- this.value = value;
- code = indexValueCode( value );
- this.timestampUuid = timestampUuid;
- this.ledgerColumn = ledgerColumn;
- }
-
-
- public String getPath() {
- return path;
- }
-
-
- public void setPath( String path ) {
- this.path = path;
- }
-
-
- public Object getValue() {
- return value;
- }
-
-
- public byte getValueCode() {
- return code;
- }
-
-
- public UUID getTimestampUuid() {
- return timestampUuid;
- }
-
-
- public DynamicComposite getIndexComposite() {
- return new DynamicComposite( code, value, getId(), timestampUuid );
- }
-
-
- public DynamicComposite getIndexComposite( Object... ids ) {
- return new DynamicComposite( code, value, asList( ids ), timestampUuid );
- }
-
-
- public ByteBuffer getLedgerColumn() {
- return this.ledgerColumn;
- }
- }
-
-
- public static class UniqueIndexEntry {
- private final byte code;
- private String path;
- private final Object value;
-
-
- public UniqueIndexEntry( String path, Object value ) {
- this.path = path;
- this.value = value;
- code = indexValueCode( value );
- }
-
-
- public String getPath() {
- return path;
- }
-
-
- public void setPath( String path ) {
- this.path = path;
- }
-
-
- public Object getValue() {
- return value;
- }
-
-
- public byte getValueCode() {
- return code;
- }
-
-
- public DynamicComposite getIndexComposite() {
- return new DynamicComposite( code, value );
- }
- }
-
-
- private static String prepStringForIndex( String str ) {
- str = str.trim().toLowerCase();
- str = str.substring( 0, Math.min( INDEX_STRING_VALUE_LENGTH, str.length() ) );
- return str;
- }
-
-
- /**
- * @param obj
- * @return
- */
- public static Object toIndexableValue( Object obj ) {
- if ( obj == null ) {
- return null;
- }
-
- if ( obj instanceof String ) {
- return prepStringForIndex( ( String ) obj );
- }
-
- // UUIDs, and BigIntegers map to Cassandra UTF8Type and IntegerType
- if ( ( obj instanceof UUID ) || ( obj instanceof BigInteger ) ) {
- return obj;
- }
-
- // For any numeric values, turn them into a long
- // and make them BigIntegers for IntegerType
- if ( obj instanceof Number ) {
- return BigInteger.valueOf( ( ( Number ) obj ).longValue() );
- }
-
- if ( obj instanceof Boolean ) {
- return BigInteger.valueOf( ( ( Boolean ) obj ) ? 1L : 0L );
- }
-
- if ( obj instanceof Date ) {
- return BigInteger.valueOf( ( ( Date ) obj ).getTime() );
- }
-
- if ( obj instanceof byte[] ) {
- return wrap( ( byte[] ) obj );
- }
-
- if ( obj instanceof ByteBuffer ) {
- return obj;
- }
-
- JsonNode json = toJsonNode( obj );
- if ( ( json != null ) && json.isValueNode() ) {
- if ( json.isBigInteger() ) {
- return json.asInt();
- }
- else if ( json.isNumber() || json.isBoolean() ) {
- return BigInteger.valueOf( json.asLong() );
- }
- else if ( json.isTextual() ) {
- return prepStringForIndex( json.asText() );
- }
- else if ( json.isBinary() ) {
- try {
- return wrap( json.binaryValue() );
- }
- catch ( IOException e ) {
- }
- }
- }
-
- return null;
- }
-
-
- public static boolean validIndexableValue( Object obj ) {
- return toIndexableValue( obj ) != null;
- }
-
-
- public static boolean validIndexableValueOrJson( Object obj ) {
- if ( ( obj instanceof Map ) || ( obj instanceof List ) || ( obj instanceof JsonNode ) ) {
- return true;
- }
- return toIndexableValue( obj ) != null;
- }
-
-
- public static byte indexValueCode( Object obj ) {
- obj = toIndexableValue( obj );
- if ( obj instanceof String ) {
- return VALUE_CODE_UTF8;
- }
- else if ( obj instanceof UUID ) {
- return VALUE_CODE_UUID;
- }
- else if ( obj instanceof BigInteger ) {
- return VALUE_CODE_INT;
- }
- else if ( obj instanceof Number ) {
- return VALUE_CODE_INT;
- }
- else {
- return VALUE_CODE_BYTES;
- }
- }
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static int compareIndexedValues( Object o1, Object o2 ) {
- o1 = toIndexableValue( o1 );
- o2 = toIndexableValue( o2 );
- if ( ( o1 == null ) && ( o2 == null ) ) {
- return 0;
- }
- else if ( o1 == null ) {
- return -1;
- }
- else if ( o2 == null ) {
- return 1;
- }
- int c1 = indexValueCode( o1 );
- int c2 = indexValueCode( o2 );
- if ( c1 == c2 ) {
- if ( o1 instanceof UUID ) {
- UUIDComparator.staticCompare( ( UUID ) o1, ( UUID ) o2 );
- }
- else if ( o1 instanceof Comparable ) {
- return ( ( Comparable ) o1 ).compareTo( o2 );
- }
- }
- return c1 - c2;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/f95d39c7/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java
deleted file mode 100644
index edd9fc5..0000000
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2014 The Apache Software Foundation.
- *
- * 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 org.apache.usergrid.persistence.cassandra;
-
-import java.nio.ByteBuffer;
-import org.apache.usergrid.persistence.EntityManager;
-import org.apache.usergrid.persistence.index.query.Query;
-import org.apache.usergrid.persistence.Results;
-import org.apache.usergrid.persistence.query.ir.QueryNode;
-import org.apache.usergrid.persistence.query.ir.QuerySlice;
-import org.apache.usergrid.persistence.query.ir.SearchVisitor;
-import org.apache.usergrid.persistence.schema.CollectionInfo;
-
-import me.prettyprint.cassandra.serializers.UUIDSerializer;
-
-public interface QueryProcessor {
- int PAGE_SIZE = 1000;
-
- /**
- * Apply cursor position and sort order to this slice. This should only be invoke
- * at evaluation time to ensure that the IR tree has already been fully constructed
- */
- void applyCursorAndSort(QuerySlice slice);
-
- CollectionInfo getCollectionInfo();
-
- /**
- * Return the node id from the cursor cache
- */
- ByteBuffer getCursorCache(int nodeId);
-
- EntityManager getEntityManager();
-
- QueryNode getFirstNode();
-
- /** @return the pageSizeHint */
- int getPageSizeHint(QueryNode node);
-
- Query getQuery();
-
- /** Return the iterator results, ordered if required */
- Results getResults(SearchVisitor visitor) throws Exception;
-
- void setQuery(Query query);
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/f95d39c7/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessorImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessorImpl.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessorImpl.java
deleted file mode 100644
index 94569d5..0000000
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessorImpl.java
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.usergrid.persistence.cassandra;
-
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Stack;
-import java.util.UUID;
-import org.apache.usergrid.persistence.EntityManager;
-import org.apache.usergrid.persistence.Results;
-import org.apache.usergrid.persistence.Schema;
-import static org.apache.usergrid.persistence.Schema.getDefaultSchema;
-import org.apache.usergrid.persistence.entities.User;
-import org.apache.usergrid.persistence.exceptions.PersistenceException;
-import org.apache.usergrid.persistence.index.exceptions.IndexException;
-import org.apache.usergrid.persistence.index.exceptions.NoFullTextIndexException;
-import org.apache.usergrid.persistence.index.exceptions.NoIndexException;
-import org.apache.usergrid.persistence.index.query.Identifier;
-import org.apache.usergrid.persistence.index.query.Query;
-import org.apache.usergrid.persistence.index.query.Query.SortDirection;
-import org.apache.usergrid.persistence.index.query.Query.SortPredicate;
-import org.apache.usergrid.persistence.index.query.tree.AndOperand;
-import org.apache.usergrid.persistence.index.query.tree.ContainsOperand;
-import org.apache.usergrid.persistence.index.query.tree.Equal;
-import org.apache.usergrid.persistence.index.query.tree.EqualityOperand;
-import org.apache.usergrid.persistence.index.query.tree.GreaterThan;
-import org.apache.usergrid.persistence.index.query.tree.GreaterThanEqual;
-import org.apache.usergrid.persistence.index.query.tree.LessThan;
-import org.apache.usergrid.persistence.index.query.tree.LessThanEqual;
-import org.apache.usergrid.persistence.index.query.tree.Literal;
-import org.apache.usergrid.persistence.index.query.tree.NotOperand;
-import org.apache.usergrid.persistence.index.query.tree.Operand;
-import org.apache.usergrid.persistence.index.query.tree.OrOperand;
-import org.apache.usergrid.persistence.index.query.tree.QueryVisitor;
-import org.apache.usergrid.persistence.index.query.tree.StringLiteral;
-import org.apache.usergrid.persistence.index.query.tree.WithinOperand;
-import org.apache.usergrid.persistence.query.ir.AllNode;
-import org.apache.usergrid.persistence.query.ir.AndNode;
-import org.apache.usergrid.persistence.query.ir.EmailIdentifierNode;
-import org.apache.usergrid.persistence.query.ir.NameIdentifierNode;
-import org.apache.usergrid.persistence.query.ir.NotNode;
-import org.apache.usergrid.persistence.query.ir.OrNode;
-import org.apache.usergrid.persistence.query.ir.OrderByNode;
-import org.apache.usergrid.persistence.query.ir.QueryNode;
-import org.apache.usergrid.persistence.query.ir.QuerySlice;
-import org.apache.usergrid.persistence.query.ir.SearchVisitor;
-import org.apache.usergrid.persistence.query.ir.SliceNode;
-import org.apache.usergrid.persistence.query.ir.UuidIdentifierNode;
-import org.apache.usergrid.persistence.query.ir.WithinNode;
-import org.apache.usergrid.persistence.query.ir.result.ResultIterator;
-import org.apache.usergrid.persistence.query.ir.result.ResultsLoader;
-import org.apache.usergrid.persistence.query.ir.result.ResultsLoaderFactory;
-import org.apache.usergrid.persistence.query.ir.result.ScanColumn;
-import org.apache.usergrid.persistence.schema.CollectionInfo;
-import org.elasticsearch.index.query.FilterBuilder;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-public class QueryProcessorImpl implements QueryProcessor {
-
- public static final int PAGE_SIZE = 1000;
- private static final Logger logger = LoggerFactory.getLogger( QueryProcessor.class );
-
- private static final Schema SCHEMA = getDefaultSchema();
-
- private final CollectionInfo collectionInfo;
- private final EntityManager em;
- private final ResultsLoaderFactory loaderFactory;
-
- private Operand rootOperand;
- private List<SortPredicate> sorts;
- private CursorCache cursorCache;
- private QueryNode rootNode;
- private String entityType;
-
- private int size;
- private Query query;
- private int pageSizeHint;
-
-
- public QueryProcessorImpl( Query query, CollectionInfo collectionInfo, EntityManager em,
- ResultsLoaderFactory loaderFactory ) throws PersistenceException {
- setQuery( query );
- this.collectionInfo = collectionInfo;
- this.em = em;
- this.loaderFactory = loaderFactory;
- process();
- }
-
-
- public Query getQuery() {
- return query;
- }
-
-
- public void setQuery( Query query ) {
- this.sorts = query.getSortPredicates();
- this.cursorCache = new CursorCache( query.getCursor() );
- this.rootOperand = query.getRootOperand();
- this.entityType = query.getEntityType();
- this.size = query.getLimit();
- this.query = query;
- }
-
-
- public CollectionInfo getCollectionInfo() {
- return collectionInfo;
- }
-
-
- private void process() throws PersistenceException {
-
- int opCount = 0;
-
- // no operand. Check for sorts
- if ( rootOperand != null ) {
- // visit the tree
-
- TreeEvaluator visitor = new TreeEvaluator();
-
- rootOperand.visit( visitor );
-
- rootNode = visitor.getRootNode();
-
- opCount = visitor.getSliceCount();
- }
-
- // see if we have sorts, if so, we can add them all as a single node at
- // the root
- if ( sorts.size() > 0 ) {
-
- OrderByNode order = generateSorts( opCount );
-
- opCount += order.getFirstPredicate().getAllSlices().size();
-
- rootNode = order;
- }
-
-
- //if we still don't have a root node, no query nor order by was specified,
- // just use the all node or the identifiers
- if ( rootNode == null ) {
-
-
- //a name alias or email alias was specified
- if ( query.containsSingleNameOrEmailIdentifier() ) {
-
- Identifier ident = query.getSingleIdentifier();
-
- //an email was specified. An edge case that only applies to users. This is fulgy to put here,
- // but required
- if ( query.getEntityType().equals( User.ENTITY_TYPE ) && ident.isEmail() ) {
- rootNode = new EmailIdentifierNode( ident );
- }
-
- //use the ident with the default alias. could be an email
- else {
- rootNode = new NameIdentifierNode( ident.getName() );
- }
- }
- //a uuid was specified
- else if ( query.containsSingleUuidIdentifier() ) {
- rootNode = new UuidIdentifierNode( query.getSingleUuidIdentifier() );
- }
-
-
- //nothing was specified, order it by uuid
- else {
-
-
- //this is a bit ugly, but how we handle the start parameter
- UUID startResult = query.getStartResult();
-
- boolean startResultSet = startResult != null;
-
- AllNode allNode = new AllNode( 0, startResultSet );
-
- if ( startResultSet ) {
- cursorCache.setNextCursor( allNode.getSlice().hashCode(),
- Serializers.ue.toByteBuffer( startResult ) );
- }
-
- rootNode = allNode;
- }
- }
-
- if ( opCount > 1 ) {
- pageSizeHint = PAGE_SIZE;
- }
- else {
- pageSizeHint = Math.min( size, PAGE_SIZE );
- }
- }
-
-
- public QueryNode getFirstNode() {
- return rootNode;
- }
-
-
- /**
- * Apply cursor position and sort order to this slice. This should only be invoke at evaluation time to ensure that
- * the IR tree has already been fully constructed
- */
- public void applyCursorAndSort( QuerySlice slice ) {
- // apply the sort first, since this can change the hash code
- SortPredicate sort = getSort( slice.getPropertyName() );
-
- if ( sort != null ) {
- boolean isReversed = sort.getDirection() == SortDirection.DESCENDING;
-
- //we're reversing the direction of this slice, reverse the params as well
- if ( isReversed != slice.isReversed() ) {
- slice.reverse();
- }
- }
- // apply the cursor
- ByteBuffer cursor = cursorCache.getCursorBytes( slice.hashCode() );
-
- if ( cursor != null ) {
- slice.setCursor( cursor );
- }
- }
-
-
- /**
- * Return the node id from the cursor cache
- * @param nodeId
- * @return
- */
- public ByteBuffer getCursorCache(int nodeId){
- return cursorCache.getCursorBytes( nodeId );
- }
-
-
- private SortPredicate getSort( String propertyName ) {
- for ( SortPredicate sort : sorts ) {
- if ( sort.getPropertyName().equals( propertyName ) ) {
- return sort;
- }
- }
- return null;
- }
-
-
- /** Return the iterator results, ordered if required */
- public Results getResults( SearchVisitor visitor ) throws Exception {
- // if we have no order by just load the results
-
- if ( rootNode == null ) {
- return null;
- }
-
- rootNode.visit( visitor );
-
- ResultIterator itr = visitor.getResults();
-
- List<ScanColumn> entityIds = new ArrayList<ScanColumn>( Math.min( size, Query.MAX_LIMIT ) );
-
- CursorCache resultsCursor = new CursorCache();
-
- while ( entityIds.size() < size && itr.hasNext() ) {
- entityIds.addAll( itr.next() );
- }
-
- //set our cursor, we paged through more entities than we want to return
- if ( entityIds.size() > 0 ) {
- int resultSize = Math.min( entityIds.size(), size );
- entityIds = entityIds.subList( 0, resultSize );
-
- if ( resultSize == size ) {
- itr.finalizeCursor( resultsCursor, entityIds.get( resultSize - 1 ).getUUID() );
- }
- }
- if (logger.isDebugEnabled()) {
- logger.debug("Getting result for query: [{}], returning entityIds size: {}",
- getQuery(), entityIds.size());
- }
-
- final ResultsLoader loader = loaderFactory.getResultsLoader( em, query, query.getResultsLevel() );
- final Results results = loader.getResults( entityIds, query.getEntityType() );
-
- if ( results == null ) {
- return null;
- }
-
- // now we need to set the cursor from our tree evaluation for return
- results.setCursor( resultsCursor.asString() );
-
- results.setQuery( query );
-// results.setQueryProcessor( this );
-// results.setSearchVisitor( visitor );
-
- return results;
- }
-
-
- private class TreeEvaluator implements QueryVisitor {
-
- // stack for nodes that will be used to construct the tree and create
- // objects
- private CountingStack<QueryNode> nodes = new CountingStack<QueryNode>();
-
-
- private int contextCount = -1;
-
-
- /** Get the root node in our tree for runtime evaluation */
- public QueryNode getRootNode() {
- return nodes.peek();
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.AndOperand)
- */
- @Override
- public void visit( AndOperand op ) throws IndexException {
-
- op.getLeft().visit( this );
-
- QueryNode leftResult = nodes.peek();
-
- op.getRight().visit( this );
-
- QueryNode rightResult = nodes.peek();
-
- // if the result of the left and right are the same, we don't want
- // to create an AND. We'll use the same SliceNode. Do nothing
- if ( leftResult == rightResult ) {
- return;
- }
-
- // otherwise create a new AND node from the result of the visit
-
- QueryNode right = nodes.pop();
- QueryNode left = nodes.pop();
-
- AndNode newNode = new AndNode( left, right );
-
- nodes.push( newNode );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.OrOperand)
- */
- @Override
- public void visit( OrOperand op ) throws IndexException {
-
- // we need to create a new slicenode for the children of this
- // operation
-
- Operand left = op.getLeft();
- Operand right = op.getRight();
-
- // we only create a new slice node if our children are && and ||
- // operations
- createNewSlice( left );
-
- left.visit( this );
-
- // we only create a new slice node if our children are && and ||
- // operations
- createNewSlice( right );
-
- right.visit( this );
-
- QueryNode rightResult = nodes.pop();
- QueryNode leftResult = nodes.pop();
-
- // rewrite with the new Or operand
- OrNode orNode = new OrNode( leftResult, rightResult, ++contextCount );
-
- nodes.push( orNode );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.NotOperand)
- */
- @Override
- public void visit( NotOperand op ) throws IndexException {
-
- // create a new context since any child of NOT will need to be
- // evaluated independently
- Operand child = op.getOperation();
- createNewSlice( child );
- child.visit( this );
-
- nodes.push( new NotNode( nodes.pop(), new AllNode( ++contextCount, false ) ) );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.ContainsOperand)
- */
- @Override
- public void visit( ContainsOperand op ) throws NoFullTextIndexException {
-
- String propertyName = op.getProperty().getValue();
-
- if ( !SCHEMA.isPropertyFulltextIndexed( entityType, propertyName ) ) {
- throw new NoFullTextIndexException( entityType, propertyName );
- }
-
- StringLiteral string = op.getString();
-
- String indexName = op.getProperty().getIndexedValue();
-
- SliceNode node = null;
-
- // sdg - if left & right have same field name, we need to create a new
- // slice
- if ( !nodes.isEmpty() && nodes.peek() instanceof SliceNode
- && ( ( SliceNode ) nodes.peek() ).getSlice( indexName ) != null ) {
- node = newSliceNode();
- }
- else {
- node = getUnionNode( op );
- }
-
- String fieldName = op.getProperty().getIndexedValue();
-
- node.setStart( fieldName, string.getValue(), true );
- node.setFinish( fieldName, string.getEndValue(), true );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.WithinOperand)
- */
- @Override
- public void visit( WithinOperand op ) {
-
- // change the property name to coordinates
- nodes.push( new WithinNode( op.getProperty().getIndexedName(), op.getDistance().getFloatValue(),
- op.getLatitude().getFloatValue(), op.getLongitude().getFloatValue(), ++contextCount ) );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.LessThan)
- */
- @Override
- public void visit( LessThan op ) throws NoIndexException {
- String propertyName = op.getProperty().getValue();
-
- checkIndexed( propertyName );
-
- getUnionNode( op ).setFinish( propertyName, op.getLiteral().getValue(), false );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.LessThanEqual)
- */
- @Override
- public void visit( LessThanEqual op ) throws NoIndexException {
-
- String propertyName = op.getProperty().getValue();
-
- checkIndexed( propertyName );
-
- getUnionNode( op ).setFinish( propertyName, op.getLiteral().getValue(), true );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.Equal)
- */
- @Override
- public void visit( Equal op ) throws NoIndexException {
- String fieldName = op.getProperty().getValue();
-
- checkIndexed( fieldName );
-
- Literal<?> literal = op.getLiteral();
- SliceNode node = getUnionNode( op );
-
- // this is an edge case. If we get more edge cases, we need to push
- // this down into the literals and let the objects
- // handle this
- if ( literal instanceof StringLiteral ) {
-
- StringLiteral stringLiteral = ( StringLiteral ) literal;
-
- String endValue = stringLiteral.getEndValue();
-
- if ( endValue != null ) {
- node.setFinish( fieldName, endValue, true );
- }
- }
- else {
- node.setFinish( fieldName, literal.getValue(), true );
- }
-
- node.setStart( fieldName, literal.getValue(), true );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.GreaterThan)
- */
- @Override
- public void visit( GreaterThan op ) throws NoIndexException {
- String propertyName = op.getProperty().getValue();
-
- checkIndexed( propertyName );
-
- getUnionNode( op ).setStart( propertyName, op.getLiteral().getValue(), false );
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.usergrid.persistence.query.tree.QueryVisitor#visit(org.apache.usergrid
- * .persistence.query.tree.GreaterThanEqual)
- */
- @Override
- public void visit( GreaterThanEqual op ) throws NoIndexException {
- String propertyName = op.getProperty().getValue();
-
- checkIndexed( propertyName );
-
- getUnionNode( op ).setStart( propertyName, op.getLiteral().getValue(), true );
- }
-
-
- /**
- * Return the current leaf node to add to if it exists. This means that we can compress multiple 'AND'
- * operations and ranges into a single node. Otherwise a new node is created and pushed to the stack
- *
- * @param current The current operand node
- */
- private SliceNode getUnionNode( EqualityOperand current ) {
-
- /**
- * we only create a new slice node in 3 situations 1. No nodes exist 2.
- * The parent node is not an AND node. Meaning we can't add this slice to
- * the current set of slices 3. Our current top of stack is not a slice
- * node.
- */
- // no nodes exist
- if ( nodes.size() == 0 || !( nodes.peek() instanceof SliceNode ) ) {
- return newSliceNode();
- }
-
- return ( SliceNode ) nodes.peek();
- }
-
-
- /** The new slice node */
- private SliceNode newSliceNode() {
- SliceNode sliceNode = new SliceNode( ++contextCount );
-
- nodes.push( sliceNode );
-
- return sliceNode;
- }
-
-
- /** Create a new slice if one will be required within the context of this node */
- private void createNewSlice( Operand child ) {
- if ( child instanceof EqualityOperand || child instanceof AndOperand || child instanceof ContainsOperand ) {
- newSliceNode();
- }
- }
-
-
- public int getSliceCount() {
- return nodes.getSliceCount();
- }
-
- @Override
- public QueryBuilder getQueryBuilder() {
- throw new UnsupportedOperationException("Not supported by this vistor implementation.");
- }
-
- @Override
- public FilterBuilder getFilterBuilder() {
- throw new UnsupportedOperationException("Not supported by this vistor implementation.");
- }
- }
-
-
- private static class CountingStack<T> extends Stack<T> {
-
- private int count = 0;
- private static final long serialVersionUID = 1L;
-
-
- /* (non-Javadoc)
- * @see java.util.Stack#pop()
- */
- @Override
- public synchronized T pop() {
- T entry = super.pop();
-
- if ( entry instanceof SliceNode ) {
- count += ( ( SliceNode ) entry ).getAllSlices().size();
- }
-
- return entry;
- }
-
-
- public int getSliceCount() {
-
- Iterator<T> itr = this.iterator();
-
- T entry;
-
- while ( itr.hasNext() ) {
- entry = itr.next();
-
- if ( entry instanceof SliceNode ) {
- count += ( ( SliceNode ) entry ).getAllSlices().size();
- }
- }
-
- return count;
- }
- }
-
-
- /** @return the pageSizeHint */
- public int getPageSizeHint( QueryNode node ) {
- /*****
- * DO NOT REMOVE THIS PIECE OF CODE!!!!!!!!!!!
- * It is crucial that the root iterator only needs the result set size per page
- * otherwise our cursor logic will fail when passing cursor data to the leaf nodes
- *******/
- if(node == rootNode){
- return size;
- }
-
- return pageSizeHint;
- }
-
-
- /** Generate a slice node with scan ranges for all the properties in our sort cache */
- private OrderByNode generateSorts( int opCount ) throws NoIndexException {
-
- // the value is irrelevant since we'll only ever have 1 slice node
- // if this is called
- SliceNode slice = new SliceNode( opCount );
-
- SortPredicate first = sorts.get( 0 );
-
- String propertyName = first.getPropertyName();
-
- checkIndexed( propertyName );
-
- slice.setStart( propertyName, null, true );
- slice.setFinish( propertyName, null, true );
-
-
- for ( int i = 1; i < sorts.size(); i++ ) {
- checkIndexed( sorts.get( i ).getPropertyName() );
- }
-
-
- return new OrderByNode( slice, sorts.subList( 1, sorts.size() ), rootNode );
- }
-
-
- private void checkIndexed( String propertyName ) throws NoIndexException {
-
- if ( propertyName == null || propertyName.isEmpty() || ( !SCHEMA.isPropertyIndexed( entityType, propertyName )
- && collectionInfo != null ) ) {
- throw new NoIndexException( entityType, propertyName );
- }
- }
-
-
- public EntityManager getEntityManager() {
- return em;
- }
-}