]> source.dussan.org Git - archiva.git/commitdiff
fix checksum search cassandra search
authorOlivier Lamy <olamy@apache.org>
Mon, 24 Mar 2014 01:36:39 +0000 (01:36 +0000)
committerOlivier Lamy <olamy@apache.org>
Mon, 24 Mar 2014 01:36:39 +0000 (01:36 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1580691 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/DefaultCassandraArchivaManager.java
archiva-modules/plugins/problem-reports/src/main/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumer.java

index 7bec0d6bdaf726e8ecbcfa78483be9ee0454341d..cdd865d568ad0e87b59561c9f3770686f7d14187 100644 (file)
@@ -98,7 +98,7 @@ public interface MetadataRepository
     Collection<String> getRepositories()
         throws MetadataRepositoryException;
 
-    List<ArtifactMetadata> getArtifactsByChecksum( String repositoryId, String checksum )
+    Collection<ArtifactMetadata> getArtifactsByChecksum( String repositoryId, String checksum )
         throws MetadataRepositoryException;
 
     void removeArtifact( String repositoryId, String namespace, String project, String version, String id )
index e119116718b2ba6060e53981f8af95847daf65d7..c33c8d676becd8c5d085a465944700b0ae205341 100644 (file)
@@ -1164,7 +1164,7 @@ public abstract class AbstractMetadataRepositoryTest
         ArtifactMetadata artifact = createArtifact();
         repository.updateArtifact( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
 
-        List<ArtifactMetadata> artifactsByChecksum = repository.getArtifactsByChecksum( TEST_REPO_ID, "not checksum" );
+        Collection<ArtifactMetadata> artifactsByChecksum = repository.getArtifactsByChecksum( TEST_REPO_ID, "not checksum" );
         assertEquals( Collections.<ArtifactMetadata>emptyList(), artifactsByChecksum );
     }
 
index 6eda35d5ef677f204ae098c0e4c7fb168c775cb1..83168626968ed6da9ef137ed8a991d5330236d58 100644 (file)
@@ -723,7 +723,7 @@ public class CassandraMetadataRepository
         return projectMetadata;
     }
 
-    protected ProjectVersionMetadataModel map( ColumnSlice<String, String> columnSlice )
+    protected ProjectVersionMetadataModel mapProjectVersionMetadataModel( ColumnSlice<String, String> columnSlice )
     {
         ProjectVersionMetadataModel projectVersionMetadataModel = new ProjectVersionMetadataModel();
         projectVersionMetadataModel.setId( getStringValue( columnSlice, "id" ) );
@@ -786,7 +786,8 @@ public class CassandraMetadataRepository
         boolean creation = true;
         if ( result.get().getCount() > 0 )
         {
-            projectVersionMetadataModel = map( result.get().getList().get( 0 ).getColumnSlice() );
+            projectVersionMetadataModel =
+                mapProjectVersionMetadataModel( result.get().getList().get( 0 ).getColumnSlice() );
             creation = false;
         }
         else
@@ -1675,27 +1676,11 @@ public class CassandraMetadataRepository
         for ( Row<String, String, Long> row : result.get() )
         {
             ColumnSlice<String, Long> columnSlice = row.getColumnSlice();
-            String repositoryName =
-                ss.fromByteBuffer( columnSlice.getColumnByName( "repositoryName" ).getValueBytes() );
+            String repositoryName = getAsStringValue( columnSlice, "repositoryName" );
             if ( StringUtils.equals( repositoryName, repositoryId ) )
             {
-                ArtifactMetadata artifactMetadata = new ArtifactMetadata();
-                artifactMetadata.setNamespace( getAsStringValue( columnSlice, "namespaceId" ) );
-                artifactMetadata.setSize( getLongValue( columnSlice, "size" ) );
-                artifactMetadata.setId( getAsStringValue( columnSlice, "id" ) );
-                artifactMetadata.setFileLastModified( getLongValue( columnSlice, "fileLastModified" ) );
-                artifactMetadata.setMd5( getAsStringValue( columnSlice, "md5" ) );
-                artifactMetadata.setProject( getAsStringValue( columnSlice, "project" ) );
-                artifactMetadata.setProjectVersion( getAsStringValue( columnSlice, "projectVersion" ) );
-                artifactMetadata.setRepositoryId( repositoryName );
-                artifactMetadata.setSha1( getAsStringValue( columnSlice, "sha1" ) );
-                artifactMetadata.setVersion( getAsStringValue( columnSlice, "version" ) );
-                Long whenGathered = getLongValue( columnSlice, "whenGathered" );
-                if ( whenGathered != null )
-                {
-                    artifactMetadata.setWhenGathered( new Date( whenGathered ) );
-                }
-                artifactMetadatas.add( artifactMetadata );
+
+                artifactMetadatas.add( mapArtifactMetadataLongColumnSlice( columnSlice ) );
             }
         }
 
@@ -1703,6 +1688,27 @@ public class CassandraMetadataRepository
     }
 
 
+    protected ArtifactMetadata mapArtifactMetadataLongColumnSlice( ColumnSlice columnSlice )
+    {
+        ArtifactMetadata artifactMetadata = new ArtifactMetadata();
+        artifactMetadata.setNamespace( getAsStringValue( columnSlice, "namespaceId" ) );
+        artifactMetadata.setSize( getLongValue( columnSlice, "size" ) );
+        artifactMetadata.setId( getAsStringValue( columnSlice, "id" ) );
+        artifactMetadata.setFileLastModified( getLongValue( columnSlice, "fileLastModified" ) );
+        artifactMetadata.setMd5( getAsStringValue( columnSlice, "md5" ) );
+        artifactMetadata.setProject( getAsStringValue( columnSlice, "project" ) );
+        artifactMetadata.setProjectVersion( getAsStringValue( columnSlice, "projectVersion" ) );
+        artifactMetadata.setRepositoryId( getStringValue( columnSlice, "repositoryName" ) );
+        artifactMetadata.setSha1( getAsStringValue( columnSlice, "sha1" ) );
+        artifactMetadata.setVersion( getAsStringValue( columnSlice, "version" ) );
+        Long whenGathered = getLongValue( columnSlice, "whenGathered" );
+        if ( whenGathered != null )
+        {
+            artifactMetadata.setWhenGathered( new Date( whenGathered ) );
+        }
+        return artifactMetadata;
+    }
+
     protected void populateFacets( final ArtifactMetadata artifactMetadata )
     {
 /*        final List<MetadataFacetModel> metadataFacetModels = new ArrayList<MetadataFacetModel>();
@@ -1760,55 +1766,61 @@ public class CassandraMetadataRepository
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByChecksum( final String repositoryId, final String checksum )
+    public Collection<ArtifactMetadata> getArtifactsByChecksum( final String repositoryId, final String checksum )
         throws MetadataRepositoryException
     {
-/*        final List<ArtifactMetadataModel> artifactMetadataModels = new ArrayList<ArtifactMetadataModel>();
+        Keyspace keyspace = cassandraArchivaManager.getKeyspace();
+        StringSerializer ss = StringSerializer.get();
 
-        if ( logger.isDebugEnabled() )
-        {
-            logger.debug( "all ArtifactMetadataModel: {}", getArtifactMetadataModelEntityManager().getAll() );
-        }
+        // cql cannot run or in queries so running twice the query
+        Map<String, ArtifactMetadata> artifactMetadataMap = new HashMap<String, ArtifactMetadata>();
 
-        // FIXME cql query
-        getArtifactMetadataModelEntityManager().visitAll( new Function<ArtifactMetadataModel, Boolean>()
+        RangeSlicesQuery<String, String, String> query = HFactory //
+            .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
+            .setColumnFamily( cassandraArchivaManager.getArtifactMetadataModelFamilyName() ) //
+            .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
+                             "repositoryName", "version", "whenGathered", "sha1" ); //
+
+        query = query.addEqualsExpression( "sha1", checksum );
+
+        QueryResult<OrderedRows<String, String, String>> result = query.execute();
+
+        for ( Row<String, String, String> row : result.get() )
         {
-            @Override
-            public Boolean apply( ArtifactMetadataModel artifactMetadataModel )
+            ColumnSlice<String, String> columnSlice = row.getColumnSlice();
+            String repositoryName = getStringValue( columnSlice, "repositoryName" );
+            if ( StringUtils.equals( repositoryName, repositoryId ) )
             {
-                if ( artifactMetadataModel != null )
-                {
-                    if ( StringUtils.equals( artifactMetadataModel.getRepositoryId(), repositoryId )
-                        && artifactMetadataModel.getNamespace() != null &&
-                        artifactMetadataModel.getProject() != null && artifactMetadataModel.getId() != null )
-                    {
 
-                        if ( StringUtils.equals( checksum, artifactMetadataModel.getMd5() ) || StringUtils.equals(
-                            checksum, artifactMetadataModel.getSha1() ) )
-                        {
-                            artifactMetadataModels.add( artifactMetadataModel );
-                        }
-                    }
-                }
-                return Boolean.TRUE;
+                artifactMetadataMap.put( row.getKey(), mapArtifactMetadataLongColumnSlice( columnSlice ) );
             }
-        } );
-        List<ArtifactMetadata> artifactMetadatas = new ArrayList<ArtifactMetadata>( artifactMetadataModels.size() );
+        }
 
-        for ( ArtifactMetadataModel model : artifactMetadataModels )
+        query = HFactory //
+            .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
+            .setColumnFamily( cassandraArchivaManager.getArtifactMetadataModelFamilyName() ) //
+            .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
+                             "repositoryName", "version", "whenGathered", "sha1" ); //
+
+        query = query.addEqualsExpression( "md5", checksum );
+
+        result = query.execute();
+
+        for ( Row<String, String, String> row : result.get() )
         {
-            ArtifactMetadata artifactMetadata = getModelMapper().map( model, ArtifactMetadata.class );
-            populateFacets( artifactMetadata );
-            artifactMetadatas.add( artifactMetadata );
-        }
+            ColumnSlice<String, String> columnSlice = row.getColumnSlice();
+            String repositoryName = getStringValue( columnSlice, "repositoryName" );
+            if ( StringUtils.equals( repositoryName, repositoryId ) )
+            {
 
-        logger.debug( "getArtifactsByChecksum repositoryId: {}, checksum: {}, artifactMetadatas: {}", repositoryId,
-                      checksum, artifactMetadatas );
+                artifactMetadataMap.put( row.getKey(), mapArtifactMetadataLongColumnSlice( columnSlice ) );
+            }
+        }
 
-        return artifactMetadatas;*/
-        return Collections.emptyList();
+        return artifactMetadataMap.values();
     }
 
+
     @Override
     public void removeArtifact( final String repositoryId, final String namespace, final String project,
                                 final String version, final String id )
index c993284d229cd48f288c92862036e31e50073783..651507d02ee395edc10a866140987b92cdf0cae1 100644 (file)
@@ -288,6 +288,19 @@ public class DefaultCassandraArchivaManager
             whenGatheredColumn.setValidationClass( ComparatorType.LONGTYPE.getClassName() );
             artifactMetadataModel.addColumnDefinition( whenGatheredColumn );
 
+            BasicColumnDefinition sha1Column = new BasicColumnDefinition();
+            sha1Column.setName( StringSerializer.get().toByteBuffer( "sha1" ) );
+            sha1Column.setIndexName( "sha1" );
+            sha1Column.setIndexType( ColumnIndexType.KEYS );
+            sha1Column.setValidationClass( ComparatorType.UTF8TYPE.getClassName() );
+            artifactMetadataModel.addColumnDefinition( sha1Column );
+
+            BasicColumnDefinition md5Column = new BasicColumnDefinition();
+            md5Column.setName( StringSerializer.get().toByteBuffer( "md5" ) );
+            md5Column.setIndexName( "md5" );
+            md5Column.setIndexType( ColumnIndexType.KEYS );
+            md5Column.setValidationClass( ComparatorType.UTF8TYPE.getClassName() );
+            artifactMetadataModel.addColumnDefinition( md5Column );
 
 
         }
index 73ff6e42f61dbedc97ab22e0c3bf625d5860b526..e4cd0a90251b74353b28024c5e206d4a7459fb16 100644 (file)
@@ -49,6 +49,7 @@ import javax.inject.Named;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -158,7 +159,7 @@ public class DuplicateArtifactsConsumer
 
         MetadataRepository metadataRepository = repositorySession.getRepository();
 
-        List<ArtifactMetadata> results;
+        Collection<ArtifactMetadata> results;
         try
         {
             results = metadataRepository.getArtifactsByChecksum( repoId, checksumSha1 );