mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-08 10:34:25 +00:00
Fix problem mapping distinct metadata values to items
git-svn-id: http://scm.dspace.org/svn/repo/trunk@2634 9c30dcfa-912a-0410-8fc2-9e0234be79fd
This commit is contained in:
@@ -177,18 +177,6 @@ public interface BrowseCreateDAO
|
|||||||
*/
|
*/
|
||||||
public int insertDistinctRecord(String table, String value, String sortValue) throws BrowseException;
|
public int insertDistinctRecord(String table, String value, String sortValue) throws BrowseException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a mapping between an item id and a distinct metadata field such as an author,
|
|
||||||
* who can appear in multiple items. To get the id of the distinct record you should
|
|
||||||
* use either getDistinctID or insertDistinctRecord as defined above.
|
|
||||||
*
|
|
||||||
* @param table the mapping table
|
|
||||||
* @param itemID the item id
|
|
||||||
* @param distinctID the id of the distinct record
|
|
||||||
* @throws BrowseException
|
|
||||||
*/
|
|
||||||
public void createDistinctMapping(String table, int itemID, int distinctID) throws BrowseException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a mapping between an item id and a distinct metadata field such as an author,
|
* Update a mapping between an item id and a distinct metadata field such as an author,
|
||||||
* who can appear in multiple items. To get the id of the distinct record you should
|
* who can appear in multiple items. To get the id of the distinct record you should
|
||||||
@@ -196,10 +184,10 @@ public interface BrowseCreateDAO
|
|||||||
*
|
*
|
||||||
* @param table the mapping table
|
* @param table the mapping table
|
||||||
* @param itemID the item id
|
* @param itemID the item id
|
||||||
* @param distinctID the id of the distinct record
|
* @param distinctIDs the id of the distinct record
|
||||||
* @throws BrowseException
|
* @throws BrowseException
|
||||||
*/
|
*/
|
||||||
public boolean updateDistinctMapping(String table, int itemID, int distinctID) throws BrowseException;
|
public boolean updateDistinctMappings(String table, int itemID, int[] distinctIDs) throws BrowseException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find out of a given table exists.
|
* Find out of a given table exists.
|
||||||
|
@@ -241,50 +241,64 @@ public class BrowseCreateDAOOracle implements BrowseCreateDAO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.dspace.browse.BrowseCreateDAO#createDistinctMapping(java.lang.String, int, int)
|
|
||||||
*/
|
|
||||||
public void createDistinctMapping(String table, int itemID, int distinctID) throws BrowseException
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
TableRow tr = DatabaseManager.create(context, table);
|
|
||||||
tr.setColumn("item_id", itemID);
|
|
||||||
tr.setColumn("distinct_id", distinctID);
|
|
||||||
DatabaseManager.update(context, tr);
|
|
||||||
}
|
|
||||||
catch (SQLException e)
|
|
||||||
{
|
|
||||||
log.error("caught exception: ", e);
|
|
||||||
String msg = "problem creating distinct mapping: table=" + table + ",item-id=" + itemID + ",distinct_id=" + distinctID;
|
|
||||||
throw new BrowseException(msg, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.dspace.browse.BrowseCreateDAO#updateDistinctMapping(java.lang.String, int, int)
|
* @see org.dspace.browse.BrowseCreateDAO#updateDistinctMapping(java.lang.String, int, int)
|
||||||
*/
|
*/
|
||||||
public boolean updateDistinctMapping(String table, int itemID, int distinctID) throws BrowseException
|
public boolean updateDistinctMappings(String table, int itemID, int[] distinctIDs) throws BrowseException
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
TableRow tr = DatabaseManager.findByUnique(context, table, "item_id", itemID);
|
// Remove (set to -1) any duplicate distinctIDs
|
||||||
if (tr != null)
|
for (int i = 0; i < distinctIDs.length; i++)
|
||||||
{
|
{
|
||||||
if (distinctID != tr.getIntColumn("distinct_id"))
|
if (!isFirstOccurrence(distinctIDs, i))
|
||||||
{
|
distinctIDs[i] = -1;
|
||||||
tr.setColumn("distinct_id", distinctID);
|
|
||||||
DatabaseManager.update(context, tr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
// Find all existing mappings for this item
|
||||||
|
TableRowIterator tri = DatabaseManager.queryTable(context, table, "SELECT * FROM " + table + " WHERE item_id=?", itemID);
|
||||||
|
if (tri != null)
|
||||||
|
{
|
||||||
|
while (tri.hasNext())
|
||||||
|
{
|
||||||
|
TableRow tr = tri.next();
|
||||||
|
|
||||||
|
// Check the item mappings to see if it contains this mapping
|
||||||
|
boolean itemIsMapped = false;
|
||||||
|
int trDistinctID = tr.getIntColumn("distinct_id");
|
||||||
|
for (int i = 0; i < distinctIDs.length; i++)
|
||||||
|
{
|
||||||
|
// Found this mapping
|
||||||
|
if (distinctIDs[i] == trDistinctID)
|
||||||
|
{
|
||||||
|
// Flag it, and remove (-1) from the item mappings
|
||||||
|
itemIsMapped = true;
|
||||||
|
distinctIDs[i] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The item is no longer mapped to this community, so remove the database record
|
||||||
|
if (!itemIsMapped)
|
||||||
|
DatabaseManager.delete(context, tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any remaining mappings need to be added to the database
|
||||||
|
for (int i = 0; i < distinctIDs.length; i++)
|
||||||
|
{
|
||||||
|
if (distinctIDs[i] > -1)
|
||||||
|
{
|
||||||
|
TableRow row = DatabaseManager.create(context, table);
|
||||||
|
row.setColumn("item_id", itemID);
|
||||||
|
row.setColumn("distinct_id", distinctIDs[i]);
|
||||||
|
DatabaseManager.update(context, row);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (SQLException e)
|
catch (SQLException e)
|
||||||
{
|
{
|
||||||
log.error("caught exception: ", e);
|
log.error("caught exception: ", e);
|
||||||
String msg = "problem updating distinct mapping: table=" + table + ",item-id=" + itemID + ",distinct_id=" + distinctID;
|
String msg = "problem updating distinct mappings: table=" + table + ",item-id=" + itemID;
|
||||||
throw new BrowseException(msg, e);
|
throw new BrowseException(msg, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -238,50 +238,64 @@ public class BrowseCreateDAOPostgres implements BrowseCreateDAO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.dspace.browse.BrowseCreateDAO#createDistinctMapping(java.lang.String, int, int)
|
|
||||||
*/
|
|
||||||
public void createDistinctMapping(String table, int itemID, int distinctID)
|
|
||||||
throws BrowseException
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
TableRow tr = DatabaseManager.create(context, table);
|
|
||||||
tr.setColumn("item_id", itemID);
|
|
||||||
tr.setColumn("distinct_id", distinctID);
|
|
||||||
DatabaseManager.update(context, tr);
|
|
||||||
}
|
|
||||||
catch (SQLException e)
|
|
||||||
{
|
|
||||||
log.error("caught exception: ", e);
|
|
||||||
String msg = "problem creating distinct mapping: table=" + table + ",item-id=" + itemID + ",distinct_id=" + distinctID;
|
|
||||||
throw new BrowseException(msg, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.dspace.browse.BrowseCreateDAO#updateDistinctMapping(java.lang.String, int, int)
|
* @see org.dspace.browse.BrowseCreateDAO#updateDistinctMapping(java.lang.String, int, int)
|
||||||
*/
|
*/
|
||||||
public boolean updateDistinctMapping(String table, int itemID, int distinctID) throws BrowseException
|
public boolean updateDistinctMappings(String table, int itemID, int[] distinctIDs) throws BrowseException
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
TableRow tr = DatabaseManager.findByUnique(context, table, "item_id", itemID);
|
// Remove (set to -1) any duplicate distinctIDs
|
||||||
if (tr != null)
|
for (int i = 0; i < distinctIDs.length; i++)
|
||||||
{
|
{
|
||||||
if (distinctID != tr.getIntColumn("distinct_id"))
|
if (!isFirstOccurrence(distinctIDs, i))
|
||||||
{
|
distinctIDs[i] = -1;
|
||||||
tr.setColumn("distinct_id", distinctID);
|
|
||||||
DatabaseManager.update(context, tr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
// Find all existing mappings for this item
|
||||||
|
TableRowIterator tri = DatabaseManager.queryTable(context, table, "SELECT * FROM " + table + " WHERE item_id=?", itemID);
|
||||||
|
if (tri != null)
|
||||||
|
{
|
||||||
|
while (tri.hasNext())
|
||||||
|
{
|
||||||
|
TableRow tr = tri.next();
|
||||||
|
|
||||||
|
// Check the item mappings to see if it contains this mapping
|
||||||
|
boolean itemIsMapped = false;
|
||||||
|
int trDistinctID = tr.getIntColumn("distinct_id");
|
||||||
|
for (int i = 0; i < distinctIDs.length; i++)
|
||||||
|
{
|
||||||
|
// Found this mapping
|
||||||
|
if (distinctIDs[i] == trDistinctID)
|
||||||
|
{
|
||||||
|
// Flag it, and remove (-1) from the item mappings
|
||||||
|
itemIsMapped = true;
|
||||||
|
distinctIDs[i] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The item is no longer mapped to this community, so remove the database record
|
||||||
|
if (!itemIsMapped)
|
||||||
|
DatabaseManager.delete(context, tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any remaining mappings need to be added to the database
|
||||||
|
for (int i = 0; i < distinctIDs.length; i++)
|
||||||
|
{
|
||||||
|
if (distinctIDs[i] > -1)
|
||||||
|
{
|
||||||
|
TableRow row = DatabaseManager.create(context, table);
|
||||||
|
row.setColumn("item_id", itemID);
|
||||||
|
row.setColumn("distinct_id", distinctIDs[i]);
|
||||||
|
DatabaseManager.update(context, row);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (SQLException e)
|
catch (SQLException e)
|
||||||
{
|
{
|
||||||
log.error("caught exception: ", e);
|
log.error("caught exception: ", e);
|
||||||
String msg = "problem updating distinct mapping: table=" + table + ",item-id=" + itemID + ",distinct_id=" + distinctID;
|
String msg = "problem updating distinct mappings: table=" + table + ",item-id=" + itemID;
|
||||||
throw new BrowseException(msg, e);
|
throw new BrowseException(msg, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,8 +40,10 @@ import java.sql.SQLException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import org.apache.commons.cli.CommandLine;
|
import org.apache.commons.cli.CommandLine;
|
||||||
@@ -415,7 +417,7 @@ public class IndexBrowse
|
|||||||
|
|
||||||
if (bis[i].isMetadataIndex())
|
if (bis[i].isMetadataIndex())
|
||||||
{
|
{
|
||||||
boolean itemMapped = false;
|
Set<Integer> distIDSet = new HashSet<Integer>();
|
||||||
|
|
||||||
// now index the new details - but only if it's archived and not withdrawn
|
// now index the new details - but only if it's archived and not withdrawn
|
||||||
if (item.isArchived() && !item.isWithdrawn())
|
if (item.isArchived() && !item.isWithdrawn())
|
||||||
@@ -443,23 +445,31 @@ public class IndexBrowse
|
|||||||
{
|
{
|
||||||
// get the normalised version of the value
|
// get the normalised version of the value
|
||||||
String nVal = OrderFormat.makeSortString(values[x].value, values[x].language, bis[i].getDataType());
|
String nVal = OrderFormat.makeSortString(values[x].value, values[x].language, bis[i].getDataType());
|
||||||
int distinctID = dao.getDistinctID(bis[i].getDistinctTableName(), values[x].value, nVal);
|
distIDSet.add(dao.getDistinctID(bis[i].getDistinctTableName(), values[x].value, nVal));
|
||||||
|
|
||||||
// Update the existing mapping, or create a new one if it doesn't exist
|
|
||||||
if (!dao.updateDistinctMapping(bis[i].getMapTableName(), item.getID(), distinctID))
|
|
||||||
dao.createDistinctMapping(bis[i].getMapTableName(), item.getID(), distinctID);
|
|
||||||
|
|
||||||
itemMapped = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do we have any mappings?
|
||||||
|
if (distIDSet.isEmpty())
|
||||||
|
{
|
||||||
// remove any old mappings
|
// remove any old mappings
|
||||||
if (!itemMapped)
|
|
||||||
removeIndex(item.getID(), bis[i].getMapTableName());
|
removeIndex(item.getID(), bis[i].getMapTableName());
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Update the existing mappings
|
||||||
|
int[] distIDarr = new int[distIDSet.size()];
|
||||||
|
int didx = 0;
|
||||||
|
for (Integer distID : distIDSet)
|
||||||
|
{
|
||||||
|
distIDarr[didx++] = distID;
|
||||||
|
}
|
||||||
|
dao.updateDistinctMappings(bis[i].getMapTableName(), item.getID(), distIDarr);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (SQLException e)
|
catch (SQLException e)
|
||||||
|
Reference in New Issue
Block a user